Я читал об асинхронных методах С# за последние 2 дня и, насколько я понимаю, в отличие от потока (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())
Является ли вызов асинхронного метода без ожидания (предположим, что это возможно) таким же, как вызов неасинхронного метода?