【发布时间】:2013-06-07 07:49:22
【问题描述】:
过去两天我一直在阅读有关 c# 异步方法的内容,据我了解,与线程 (threadpool.queueuserworkitem()) 不同,对异步方法的调用不会立即返回,它只会在被调用的方法遇到等待或完成(或异常)
请看下面的例子。
public partial class MainWindow : Window
{
// . . .
private async void startButton_Click(object sender, RoutedEventArgs e)
{
// ONE
Task<int> getLengthTask = AccessTheWebAsync();
// FOUR
int contentLength = await getLengthTask;
// SIX
resultsTextBox.Text +=
String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
}
async Task<int> AccessTheWebAsync()
{
// TWO
HttpClient client = new HttpClient();
Task<string> getStringTask =
client.GetStringAsync("http://msdn.microsoft.com");
// THREE
string urlContents = await getStringTask;
// FIVE
return urlContents.Length;
}
}
据我所知,在上面的代码中,AccessTheWebAsync() 是同步调用的(即控制在调用时不会立即返回)。但在名为“THREE”的行中,运行时将返回控制权。
我的问题是:
运行时如何决定何时使用线程池或何时在调用线程中运行任务? (即执行代码而不返回控制)
以上代码中的哪些点会使用新线程(或线程池)?
如果
AccessTheWebAsync()执行了计算密集型操作,例如运行具有无数次迭代的循环,则控制权只会在循环完成后返回给调用者。对吗?在异步函数中,有没有办法立即返回控制,然后在后台线程中继续工作? (就像我们调用 threadpool.queueuserworkitem())
调用不带 await 的异步方法(假设可能)与调用非异步方法一样吗?
【问题讨论】:
标签: c# async-await