Так как довольно долго я пытаюсь понять асинхронно-ожидающие вещи в .NET, но я изо всех сил пытаюсь добиться успеха, всегда происходит что-то совершенно неожиданное, когда я использую async.
Вот мое заявление:
namespace ConsoleApp3
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Hello World!");
var work1 = new WorkClass();
var work2 = new WorkClass();
while(true)
{
work1.DoWork(500);
work2.DoWork(1500);
}
}
}
public class WorkClass
{
public async Task DoWork(int delayMs)
{
var x = 1;
await Task.Delay(delayMs)
var y = 2;
}
}
}
Это просто пример, который я создал, чтобы проверить, как будет выполняться код. Есть несколько вещей, которые меня удивляют.
Во-первых, здесь много тем! Если я установлю точку останова на var y = 2;
, я увижу, что threadId там не тот, это может быть 1, или 5, или 6, или что-то еще.
Это почему? Я подумал, что async / await не использует дополнительные потоки сам по себе, если только я явно не командую этим (с помощью Task.Run или создания нового потока). По крайней мере эта статья пытается сказать, что я думаю.
Хорошо, но допустим, что по какой-то причине существуют некоторые другие потоки - даже если они есть, у моего await Task.Delay(msDelay);
нет ConfigureAwait(false)
! Насколько я понимаю, без этого вызова поток не должен меняться.
Мне действительно трудно хорошо понять концепцию, потому что я не могу найти ни одного хорошего ресурса, который содержал бы всю информацию вместо нескольких частей информации.