在过去的 2 天里,我一直在阅读有关 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()
是同步调用的(即控制在调用时不会立即返回)。但是在名为“三”的行中,运行时将返回控制权。
我的问题是:
运行时如何决定何时使用线程池或何时在调用线程中运行任务?(即执行代码而不返回控制)
在上述代码中的哪些点,将使用新线程(或线程池)?
如果
AccessTheWebAsync()
做了一些计算密集型的事情,比如运行一个具有无数次迭代的循环,则控制只会在循环完成时返回给调用者。是对的吗?在异步函数中,有没有办法立即返回控制,然后在后台线程中继续工作?(就像我们调用 threadpool.queueuserworkitem() 一样)
调用没有等待的异步方法(假设它是可能的)与调用非异步方法相同吗?