我有一个简单的async
示例await
,我正在尝试完成,并且执行没有像我预期的那样返回给调用者。这是顶级方法:
protected async void MyDDL_SelectedIndexChanged(object sender, EventArgs e)
{
Task longRunningTask = LongRunningOperationAsync();
DoOtherStuff1();
DoOtherStuff2();
DoOtherStuff3();
await longRunningTask;
}
这是LongRunningOperationAsync
无法按预期工作并同步运行的方法:
private async Task LongRunningOperationAsync()
{
var myValues = await GetStuffViaLongRunningTask();
//Code to work with myValues here...
}
这里是定义GetStuffViaLongRunningTask
private async Task<IList<MyClass>> GetStuffViaLongRunningTask()
{
//...Calls to get and build up IList<MyClass>
return results;
}
问题是上面的代码没有像DoOtherStuff1();
我期望的那样返回给调用者并开始运行该方法。但是,与其调用我自己的方法并将其替换为await Task.Delay(10000);
像所有简单示例所示的那样,代码将按预期工作:
private async Task LongRunningOperationAsync()
{
//Returns to caller as expected:
await Task.Delay(10000);
}
使用上面代码的调用者的状态longRunningTask
是 aWaitingForActivation
而不是RanToCompletion
,表明它仍在处理中。
你可能会说我的GetStuffViaLongRunningTask()
方法运行得太快了,我就是看不到结果。但是,它总是需要 3-7 秒才能运行,并且您可以在调试时知道调用是阻塞的和同步的。
我在这里做错了什么,所以当在该方法中到达要调用的单词LongRunningOperationAsync()
时,我的调用不会异步工作?await
LongRunningOperationAsync