Одна из ловушек метода async
заключается в том, что операция может выполняться в разных потоках. Это можно проверить с помощью:
var z = 0;
while (z < 20)
{
Console.Write(" - Thread: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
z++;
}
, который выведет что-то вроде:
- Thread: 1 - Thread: 1 - Thread: 4 - Thread: 6 - Thread: 7 - Thread: 4
При обычном подходе, если вы используете:
var z = 0;
while (z < 20)
{
Console.Write(" - Thread: " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
z++;
}
ваш вывод будет:
- Thread: 1 - Thread: 1 - Thread: 1 - Thread: 1 - Thread: 1 - Thread: 1
Теперь, если вы инкапсулируете первый код в Thread
следующим образом:
var thread = new Thread(new ThreadStart(async () =>
{
var z = 0;
while (z < 20)
{
Console.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1000);
z++;
}
}));
thread.Start();
если вы thread.Abort
надежно убить async
запущенную операцию?