我正在研究新的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有所了解......但没有运气
答案 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
在中途切换上下文要好得多。