Я обнаружил, что когда я вызываю «асинхронную» функцию, сначала поток является основным потоком. Когда он встречает задачу ожидания, поток будет изменен на другой.
static void Main(string[] args)
{
println("Mainthread ID " + Thread.CurrentThread.GetHashCode());
var s = DoSomethingAsync();
println("Waiting for DoSomethingAsync Complete ");
Thread.Sleep(2000);
println(s.Result.ToString());
}
static async Task<int> DoSomethingAsync()
{
println("DoSomethingAsync Thread ID " + Thread.CurrentThread.GetHashCode());
int val = await Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
println("Task Thread ID " + Thread.CurrentThread.GetHashCode());
return 100;
});
println("DoSomethingAsync end " + Thread.CurrentThread.GetHashCode());
return val;
}
Результат следующий:
11:40:34 383 Mainthread ID 1
11:40:34 398 DoSomethingAsync Thread ID 1
11:40:34 400 Waiting for DoSomethingAsync Complete
11:40:35 400 Task Thread ID 3
11:40:35 400 DoSomethingAsync end 3
11:40:36 401 100
Мы видим, что идентификатор основного потока равен 1. Идентификатор потока DoSomethingAsync также равен 1. Они такие же. Итак, в начале выполнения функции «async» эту часть выполняет основной поток.
Это означает, что когда основной поток встречает функцию «async», он будет заблокирован для выполнения чего-либо до тех пор, пока не встретит задачу await. Функция «async» не делает вещи асинхронными мгновенно. Это правильно?
Я знаю, что если в функции «async» нет задачи ожидания, эта функция «async» будет выполняться синхронно.