Phi*_*tle 10 .net c# asynchronous task async-await
我试图了解这段代码:
[TestFixture]
public class ExampleTest
{
[Test]
public void Example()
{
AwaitEmptyTask().Wait();
}
public async Task AwaitEmptyTask()
{
await new Task(() => { });
}
}
Run Code Online (Sandbox Code Playgroud)
该方法Example永远不会结束并永久阻止. 为什么??
该修复(从返回在异步单元测试方法成株任务)是取代await new Task( () => {})与return Task.FromResult<object>(null);但同样的,为什么是这个必要吗?
我知道有一堆类似于这个的问题,但我见过的没有一个似乎解释了为什么会发生这种情况:
await正确地包含了关键字AFAIKTask.FromResult但不是为什么await new Task(() => {})不起作用Ser*_*rvy 18
你正在创建一个任务并且永远不会启动它,所以它永远不会完成.
您应该使用Task.Run创建要立即开始执行的任务,而不是使用Task构造函数.
即使你把它改成了
await Task.Run(() => { });
Run Code Online (Sandbox Code Playgroud)
它可能仍然永远不会完成.当您点击此行时,程序会创建一个继续任务,该任务将在任务完成时继续.任务为空的事实无关紧要.此时,控制流程又回到了
AwaitEmptyTask().Wait();
Run Code Online (Sandbox Code Playgroud)
等待任务完成并阻止当前线程.
任务完成后,它会尝试继续当前线程.但是,它不能,因为线程被Wait()调用阻止.
将等待的行更改为
await Task.Run(() => { }).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
这是一个常见的死锁问题.不要混合Wait()和等待.请参阅http://msdn.microsoft.com/en-us/magazine/jj991977.aspx
| 归档时间: |
|
| 查看次数: |
4814 次 |
| 最近记录: |