gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:11:19 25 4
gpt4 key购买 nike

我正在玩 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");
}
}

当我执行这段代码时,后台线程不会等待 Method 中长时间运行的任务完成。相反,它会在调用 Method 后立即执行 BgOnRunWorkerCompleted。为什么?我在这里缺少什么?

P.S:我对替代方法或正确方法不感兴趣。我想知道在这种情况下幕后究竟发生了什么?为什么不等待?

最佳答案

因此,BgDoWorkBackgroundWorker 在后台线程上调用

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

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

await 由于 Task 尚未完成而从 Method 返回的任务

同样,BgDoWork中的await返回另一个Task

因此,BackgroundWorker 看到 BgDoWork 已返回并假定它已完成。

然后引发 RunWorkerCompleted


基本上,不要将 BackgroundWorkerasync/await 混合使用!

关于c# - 为什么后台线程不等待任务完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com