我有关于异步作业的执行顺序的问题。回调异步并等待
我会问我的问题与例子,因为它更容易可以理解的。
距离https://msdn.microsoft.com/en-us/library/mt674882.aspx一些扭曲的官方例子。
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
//async operation:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoWork1();
// The await operator suspends AccessTheWebAsync.
string urlContents = await getStringTask;
DoWork2();
return urlContents.Length;
}
我可以说DoWork2
是client.GetStringAsync
回调?
如果是这样,DoWork2
在client.GetStringAsync
完成后不立即执行如果DoWork1
的运行时间比client.GetStringAsync
更长。
我在这儿吗?
是的,你开始了任务,当'DoWork1()'完成时,你将会等待任务。如果它已经完成,“DoWork2”立即启动。如果不是的话,当任务完成时'DoWork2'开始。 –
@AlexanderDerck然后它不是我预期的那种“回调”。在我看来,一旦异步函数完成,应立即执行回调。 – derek
只是为了澄清:即使DoWork1尚未完成,您还是希望DoWork2能够执行(完成getStringTask)吗?也许看看[Task.ContinueWith](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.continuewith.aspx)方法。 –