【问题标题】:Where can i find the ThreadPool.SwitchTo method?我在哪里可以找到 ThreadPool.SwitchTo 方法?
【发布时间】:2011-06-16 11:03:59
【问题描述】:

我正在研究新的 Async CTP 并查看一些示例代码,

我遇到了这段代码:

public async void button1_Click(object sender, EventArgs e) 
{ 
string text = txtInput.Text; 

await ThreadPool.SwitchTo(); // jump to the ThreadPool 

string result = ComputeOutput(text); 
string finalResult = ProcessOutput(result); 

await txtOutput.Dispatcher.SwitchTo(); // jump to the TextBox’s thread 

txtOutput.Text = finalResult; 
}

请问我在哪里可以找到 ThreadPool.SwitchTo? SwithcTo 方法不在 ThreadPool 类上

我有一个 AsyncCtpLibrary.dll 的参考...但没有运气

【问题讨论】:

  • 对我来说它看起来像是一种扩展方法。
  • 假设您已经在 Visual Studio 中加载了代码,右键单击方法名称并选择“转到定义”。它将立即将您带到定义该方法的位置,以便您可以研究它。我怀疑 chibacity 的假设是在 ThreadPool 类之外的其他地方定义的扩展方法是正确的。
  • 我虽然如此,但从哪里来?我添加了对 AsyncCtpLibrary.dll 的引用,但没有运气
  • 您必须添加正确的using 才能使用扩展方法。
  • @CharlesO:如果您想通了,请将其发布为将来帮助他人的答案。

标签: .net asynchronous threadpool async-ctp


【解决方案1】:

作为参考,CharlesO 在上面的 cmets 中回答了他的问题:

好的,找到了,总结:提供 交互的方法 线程池。备注:ThreadPoolEx 是一个 占位符。

公共共享函数 SwitchTo() As System.Runtime.CompilerServices.YieldAwaitable 成员 System.Threading.ThreadPoolEx 摘要: 创建一个可等待的 异步屈服于 等待时的线程池。

【讨论】:

    【解决方案2】:

    ThreadPool.SwitchTo 被删除大概是因为它是一个反模式。考虑一下如果在切换回原始上下文之前抛出异常会发生什么。您不能使用 finally 块作为应对措施来防范该异常并切换回来,因为 await 不能出现在 finally 块中。

    public async void button1_Click(object sender, EventArgs e) 
    { 
      await ThreadPool.SwitchTo();
      try
      {
        // Do something dangerous here.
      }
      finally
      {
        await button1.Dispatcher.SwitchTo(); // COMPILE ERROR!
      }
    
    }
    

    当然,您可以开发自定义 awaitable 和 awaiter 类型来准确实现已删除的内容。但是,使用Task.Run1 比通过await 中途切换上下文要好得多。

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 2012-05-30
      • 2013-07-13
      • 2012-06-05
      • 2011-04-24
      • 2021-02-02
      相关资源
      最近更新 更多