Ладно, думаю, я почти понял понимание всего этого async / await
и многопоточности.Я понимаю, что асинхронность связана с задачами, а многопоточность - с рабочими.Таким образом, вы можете выполнять разные задачи в одном и том же потоке ( этот ответ прекрасно объясняет это).
Поэтому я создал небольшие программы, чтобы увидеть, как происходит волшебство, и я получилнемного запутался:
public class Program
{
public static async Task Main(string[] args)
{
var task = ToastAsync();
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Cleaning the kitchen...");
await task;
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Take the toast");
}
public async static Task ToastAsync()
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Putting the toast");
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Setting a timer");
await Task.Delay(2000);
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Toast is ready");
}
}
Перед первым запуском этой программы я ожидал, что она будет запущена в одном потоке.Как и ответ, который я привел выше, я ожидал, что это будет эквивалентно «уборке кухни во время работы тостера».Хотя результаты противоречат:
[1] Putting the toast
[1] Setting a timer
[1] Cleaning the kitchen...
[4] Toast is ready
[4] Take the toast
Приведенный выше результат не имеет большого смысла для меня.Что на самом деле происходит?Кажется, что часть функции выполняется в одном потоке, а затем, когда она достигает точки await
, она обрабатывает выполнение другому потоку ...?Я даже не знал, что это возможно. D:
Более того, я немного изменил приведенный выше пример.В основной функции вместо await task;
я использовал task.Wait()
.И затем результаты изменились:
[1] Putting the toast
[1] Setting a timer
[1] Cleaning the kitchen...
[4] Toast is ready
[1] Take the toast
Теперь это больше похоже на пример.Это похоже на то, как таймер на тосте работал как другая «плита».Но почему он отличается от использования await
?И есть ли способ получить асинхронную задачу полностью в одном потоке?Я имею в виду, что Toast is ready
на thread 1
также?
ThanksAsync!