我在哪里可以找到ThreadPool.SwitchTo方法?

时间:2011-01-27 10:37:47

标签: .net asynchronous threadpool async-ctp

我正在研究新的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有所了解......但没有运气

2 个答案:

答案 0 :(得分:2)

作为参考,CharlesO在上述评论中回答了他的问题:

  

好的,发现它们,摘要:提供   与...交互的方法   线程池。备注:ThreadPoolEx是一个   占位符。

     

公共共享功能SwitchTo()As   System.Runtime.CompilerServices.YieldAwaitable   成员   System.Threading.ThreadPoolEx摘要:   创造一个等待的   异步屈服于   正在等待ThreadPool。

答案 1 :(得分:1)

ThreadPool.SwitchTo被删除大概是因为它是一个anit-pattern。考虑如果在切换回原始上下文之前抛出异常会发生什么。您无法使用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!
  }

}

当然,您可以开发自定义等待和等待类型,以实现完全删除的内容。但是,使用Task.Run 1 比通过await在中途切换上下文要好得多。