使用.NET 4.5 async\await框架后,我有一个问题。
让我们看一下这个程序(the msdn example):
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
void DoIndependentWork()
{
resultsTextBox.Text += "Working . . . . . . .\r\n";
}
该程序将按以下顺序运行:
让我花了一段时间了解的一件事是,尽管方法
GetStringAsync
具有名称,但它还是同步运行的(名称约定确实令人误解)。在oreder中以异步方式运行该方法,我们需要显式使用
Task.Run
或Task.Factory.StartNew
。但是真正的问题是,如果我们有独立的工作,为什么不立即做它,而是等待从GetStringAsync中调用await? (换句话说,为什么异步方法不能按照定义异步运行?)
编辑:
我将重新编写第二和第三个操作:
(2)GetStringAsync同步启动。
(3)在某些时候,GetStringAsync调用正在等待并且线程进行了 fork ,该控件返回到AccessTheWebAsync。
最佳答案
那是不对的。 GetStringAsync
返回一个Task<string>
。它将立即返回,这意味着DoIndependentWork
(可能)在下载完成之前运行。 await
运算符将异步等待,直到Task<T>
返回的GetStringAsync
完成为止。
返回方法后,异步方法的实际“工作”就会运行。返回的Task
(通常)将处于未完成的状态,这意味着该方法仍在异步运行。您可以检查 Task.IsCompleted
进行验证。
试试这个:
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
Debug.WriteLine("Completed? {0}", getStringTask.IsCompleted); // Will likely print false
DoIndependentWork();
string urlContents = await getStringTask;
Debug.WriteLine("Completed now? {0}", getStringTask.IsCompleted); // Will always print true
关于c# - .NET异步\等待基础知识,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19460854/