gpt4 book ai didi

c# - await Task.Delay() 与 Task.Delay().Wait()

转载 作者:IT王子 更新时间:2023-10-29 03:53:21 26 4
gpt4 key购买 nike

在 C# 中,我有以下两个简单示例:

[Test]
public void TestWait()
{
var t = Task.Factory.StartNew(() =>
{
Console.WriteLine("Start");
Task.Delay(5000).Wait();
Console.WriteLine("Done");
});
t.Wait();
Console.WriteLine("All done");
}

[Test]
public void TestAwait()
{
var t = Task.Factory.StartNew(async () =>
{
Console.WriteLine("Start");
await Task.Delay(5000);
Console.WriteLine("Done");
});
t.Wait();
Console.WriteLine("All done");
}

第一个示例创建一个打印“Start”的任务,等待 5 秒打印“Done”,然后结束任务。我等待任务完成,然后打印“全部完成”。当我运行测试时,它按预期运行。

第二个测试应该有相同的行为,除了任务内部的等待应该是非阻塞的,因为使用了 async 和 await。但是这个测试只是打印“Start”,然后立即打印“All done”,而“Done”永远不会打印出来。

我不知道为什么会出现这种行为 :S 非常感谢任何帮助 :)

最佳答案

第二个测试有两个嵌套任务,您正在等待最外层的任务,要解决此问题,您必须使用 t.Result.Wait()t.Result 获取内部任务。

第二种方法大致等同于:

public void TestAwait()
{
var t = Task.Factory.StartNew(() =>
{
Console.WriteLine("Start");
return Task.Factory.StartNew(() =>
{
Task.Delay(5000).Wait(); Console.WriteLine("Done");
});
});
t.Wait();
Console.WriteLine("All done");
}

通过调用 t.Wait(),您正在等待立即返回的最外层任务。


处理这种情况的最终“正确”方法是完全放弃使用 Wait 而只使用 await等待 可能导致 deadlock issues将 UI 附加到异步代码后。

    [Test]
public async Task TestCorrect() //note the return type of Task. This is required to get the async test 'waitable' by the framework
{
await Task.Factory.StartNew(async () =>
{
Console.WriteLine("Start");
await Task.Delay(5000);
Console.WriteLine("Done");
}).Unwrap(); //Note the call to Unwrap. This automatically attempts to find the most Inner `Task` in the return type.
Console.WriteLine("All done");
}

更好的做法是使用 Task.Run 来启动您的异步操作:

    [TestMethod]
public async Task TestCorrect()
{
await Task.Run(async () => //Task.Run automatically unwraps nested Task types!
{
Console.WriteLine("Start");
await Task.Delay(5000);
Console.WriteLine("Done");
});
Console.WriteLine("All done");
}

关于c# - await Task.Delay() 与 Task.Delay().Wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26798845/

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