我试图抓住异步等待模式。继this例如,我实现了 这个小程序:async等待错误的执行顺序
private async void asynchWork()
{
// Line 1
Task<string> readTask = asynchAwaitWork();
// Line 2
synchWork();
// Line 3
string result = await readTask;
// Line 4
Debug.WriteLine(result);
Debug.WriteLine("The End");
}
private void synchWork()
{
for (int i = 0; i < 5; i++)
{
Debug.WriteLine("SynchWork For i : " + i);
Thread.Sleep(750);
}
}
private async Task<string> asynchAwaitWork()
{
for (int i = 0; i < 15; i++)
{
Debug.WriteLine("A-SynchWork For i : " + (i+111));
Thread.Sleep(750);
}
return "finished";
}
我预计,1号线执行,那么2号线和4号线将不得不等待,直到3号线完成并返回一个字符串。 但看着输出synchWork
方法在asynchWork
方法后执行。
A-SynchWork对于i:111
A-SynchWork对于i:112
A-SynchWork对于i:113
A-SynchWork对于i:114
A-SynchWork For I:115
...
A-SynchWork对于i:125
SynchWork对于i:0
SynchWork对于i:1个
SynchWork对于i:2
SynchWork对于i:3
SynchWork对于i:4
已完成
终结
我预期当asynchWork
方法是buisy并等待在第3行的结果被在时所执行的方法synchWork
。 这个例子中我误解了什么?还是仅仅是Debug.WriteLine
的输出是按顺序执行的,但是真正的工作顺序是按照我的期望执行的?
编辑: 随着意见和答案的帮助下,我了解到:
不要忽视警告,并研究它们的含义;使用
await
关键字允许等待)由该方法内部创建的
Task
执行的操作的结果。
编辑2:
- 但任务必须启动!否则将不会有并行处理,编译器将通过主线程追踪它,而Line 3实际上只有Line 4的阻塞函数不多。
因为Thread.Sleep(750)
只是一个模拟的工作,我并不真的需要Delay
这也适用:
private async Task<string> asynchAwaitWork()
{
await Task.Run(()=> {
for (int i = 0; i < 15; i++)
{
Debug.WriteLine("A-SynchWork For i : " + (i+111));
Thread.Sleep(750);
}
});
return "finished";
}
非常感谢你。我学到了很多:)
你应该得到'asynchAwaitWork'的编译器警告,它给出了为什么它不起作用的线索 –
@ScottChamberlain等待丢失它说。因此它将被同步执行。我只是不太明白为什么从这个小小的信息。 –
@MongZhu然后对这个警告做一些研究。这里有很多信息。 – Servy