为什么后台线程不等待任务完成?

Har*_*san 4 c# async-await

我正在玩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:我对其他方式或正确的方法不感兴趣.我想知道在这种情况下幕后实际发生了什么?为什么不等?

Nic*_*ler 7

因此,BgDoWork在后台线程上调用BackgroundWorker

它调用Method,启动循环和调用http.GetAsync

GetAsync返回a Task并继续它在另一个线程上的工作.

await的任务,因为Task尚未完成,返回Method

同样,await BgDoWork返回另一个Task

因此,返回的BackgroundWorker视图BgDoWork已经完成.

然后提出来 RunWorkerCompleted


基本上,不要混BackgroundWorkerasync / await!