【发布时间】:2016-09-02 06:53:32
【问题描述】:
我对异步作业的执行顺序有疑问。
我会用例子来问我的问题,因为它更容易理解。
这是来自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 完成后立即执行 IF DoWork1 运行时间比 client.GetStringAsync 长。
我在这里吗?
【问题讨论】:
-
是的,您开始任务,当
DoWork1()完成时,您将等待任务。如果已经完成,DoWork2会立即开始。如果没有,DoWork2在任务完成时启动。 -
@AlexanderDerck 那么这不是我所期望的那种“回调”。在我看来,一旦异步函数完成,回调应该立即执行。
-
只是为了澄清:即使 DoWork1 尚未完成,您是否希望 DoWork2 执行(在 getStringTask 完成时)?也许看看Task.ContinueWith 方法。
-
这就是为什么这通常不被称为“回调”。它是相关的,并且在幕后可能会使用回调,但您通常不会发现
await被描述为回调。 -
@HansKesting 是的,我希望在 getStringTask 完成后立即执行
DoWork2。似乎“等待”和“Task.ContinueWith”功能相同。看到这个帖子:stackoverflow.com/questions/8767218/…
标签: c# asynchronous async-await c#-6.0