据此_
如果 BackgroundWorker 从其 DoWork 处理程序启动另一个 BackgroundWorker,则嵌套的 BackgroundWorker 不会捕获 UI SynchronizationContext
但是,对于 .NET 4.0,尤其是 4.5 以后的版本,我从这里看到了很多这样的示例代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Shown += async ( s, e ) => { txtResult.Text = await DownloadAsync() + "Done!"; };
}
async Task<string> DownloadAsync()
{
using ( var wc = new WebClient() )
{
var progress = new Progress<DownloadStringTaskAsyncExProgress>();
progress.ProgressChanged += ( s, e ) =>
{
progressBar.Value = e.ProgressPercentage;
txtResult.Text += e.Text;
};
return await wc.DownloadStringTaskAsyncEx(
@"http://ancillaryasync.nickbutler.net/Murphy.ashx", progress );
}
}
}
所以看起来你可以使用任务嵌套异步调用,并且 SynchronizationContext 将在嵌套调用下浮动。这个对吗?
如果是这样,有人可以向我解释 TAP 如何在非常高的水平上做到这一点。
如果不是,我需要做什么来确保我的嵌套调用可以发布到 UI 线程?
或者可能是我对原文章的理解完全错误?默认情况下,新任务的创建是否会选择当前的同步上下文?如果是这样,除非你明确地给它一个新的同步上下文,否则它怎么能在原始同步上下文之外的任何东西上运行?
请帮助我消除混乱。