我正在玩C#的异步等待功能.当我使用UI线程时,事情按预期工作.但是当我在非UI线程中使用它时,它不能按预期工作.请考虑以下代码
private void Click_Button(object sender, RoutedEventArgs e)
{
var bg = new BackgroundWorker();
bg.DoWork += BgDoWork;
bg.RunWorkerCompleted += BgOnRunWorkerCompleted;
bg.RunWorkerAsync();
}
private void BgOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
{
}
private async void BgDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
await Method();
}
private static async Task Method()
{
for (int i = int.MinValue; i < int.MaxValue; i++)
{
var http = new HttpClient();
var tsk = await http.GetAsync("http://www.ebay.com");
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码时,后台线程不会等待长时间运行的任务Method完成.相反,它立即执行BgOnRunWorkerCompleted后调用Method.为什么会这样?我在这里错过了什么?
PS:我对其他方式或正确的方法不感兴趣.我想知道在这种情况下幕后实际发生了什么?为什么不等?
因此,BgDoWork在后台线程上调用BackgroundWorker
它调用Method,启动循环和调用http.GetAsync
GetAsync返回a Task并继续它在另一个线程上的工作.
你await的任务,因为Task尚未完成,返回Method
同样,await BgDoWork返回另一个Task
因此,返回的BackgroundWorker视图BgDoWork已经完成.
然后提出来 RunWorkerCompleted
基本上,不要混BackgroundWorker有async / await!