Для тестирования я создал простое консольное приложение:
Код: Выделить всё
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main: " + Thread.CurrentThread.ManagedThreadId);
MainAsync(args).Wait();
Console.WriteLine("Main End: " + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
static async Task MainAsync(string[] args)
{
Console.WriteLine("Main Async: " + Thread.CurrentThread.ManagedThreadId);
await thisIsAsync();
}
private static async Task thisIsAsync()
{
Console.WriteLine("thisIsAsyncStart: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1);
Console.WriteLine("thisIsAsyncEnd: " + Thread.CurrentThread.ManagedThreadId);
}
}
Код: Выделить всё
Main: 8
Main Async: 8
thisIsAsyncStart: 8
thisIsAsyncEnd: 9
Main End: 8
EDIT:
Я обновил код, как предложено в ответе ниже, чтобы дождаться Task.Delay(1), но по-прежнему вижу те же результаты.
Цитата из ответа ниже:
Скорее, он позволяет разделить метод на несколько частей, некоторые из которых могут выполняться асинхронно.
Я хочу знать, где выполняется часть асинхронно, если не создано других потоков?
Если она выполняется в том же потоке, не должна ли она блокироваться из-за долгого I/ O запрос, или компилятор достаточно умен, чтобы перенести это действие в другой поток если это займет слишком много времени и все-таки будет использоваться новый поток?
Подробнее здесь: https://stackoverflow.com/questions/338 ... -thread-id
Мобильная версия