我在Microsoft网站上找到了有关异步和等待的以下示例(https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/):
然而,方法DoPriorWork()根本没有执行。这个实现有什么问题吗?谢谢!
// Three things to note in the signature:
// - The method has an async modifier.
// - The return type is Task or Task<T>. (See "Return Types" section.)
// Here, it is Task<int> because the return statement returns an integer.
// - The method name ends in "Async."
async Task<int> AccessTheWebAsync()
{
// You need to add a reference to System.Net.Http to declare client.
HttpClient client = new HttpClient();
// GetStringAsync returns a Task<string>. That means that when you await the
// task you'll get a string (urlContents).
Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
// The await operator suspends AccessTheWebAsync.
// - AccessTheWebAsync can't continue until getStringTask is complete.
// - Meanwhile, control returns to the caller of AccessTheWebAsync.
// - Control resumes here when getStringTask is complete.
// - The await operator then retrieves the string result from getStringTask.
string urlContents = await getStringTask;
// The return statement specifies an integer result.
// Any methods that are awaiting AccessTheWebAsync retrieve the length value.
return urlContents.Length;
}
我的第一个问题来自网页“If AccessTheWebAsync在调用GetStringAsync并等待其完成之间没有任何工作可做,则可以通过调用以下单个语句并等待来简化代码。” 这似乎意味着以下语句确实在执行某些操作:
Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");
这是真的吗?我认为它只是一个任务的定义,但还没有开始/运行。
第二个问题是,我尝试更改实现,以检查我的想法:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
//Task<string> getStringTask = client.GetStringAsync("https://msdn.microsoft.com");
Task<string> getStringTask = DoPriorWork();
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
void DoIndependentWork()
{
resultsTextBox.Text += "Working . . . . . . .\r\n";
}
Task<string> DoPriorWork()
{
return new Task<string>(
() =>
{
string retStr = "good";
Debug.Assert(true, "running dopriorwork");
System.Threading.Thread.Sleep(10000);
return retStr;
}
);
}
然而,方法DoPriorWork()根本没有执行。这个实现有什么问题吗?谢谢!
async Task<string> DoPriorWork() { await Task.Delay(10000); return "good";}
- Hans KestingTask(Func<TResult>)
构造函数 返回一个未启动的任务。你需要手动调用Start()
方法来启动它。 - GSerg