Я прочитал дюжину статей об async / await, и все они были отлично прочитаны.Но во всех этих статьях некоторые заблуждения / вопросы не рассматривались.Я также видел на этом форуме (это потрясающее сообщение) , но у меня нет четкого объяснения, поэтому я ищу ваши глубокие знания по этому вопросу.
Пример
В приведенном ниже примере Console App, поскольку контекст синхронизации не поддерживается, возвращаются идентификаторы потоков, а именно 1 и 5.
( Аналогичный пример с графическим интерфейсом будет работать на тот же поток , где поддерживается контекст синхронизации. )
using System;
using System.Threading;
using System.Threading.Tasks;
namespace AsyncConcept
{
class Program
{
static void Main(string[] args)
{
AsyncMethod();
Console.WriteLine("Main Thread: " + (int)AppDomain.GetCurrentThreadId());
Console.ReadLine();
}
public static async void AsyncMethod()
{
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("AsyncMethod Thread: " + (int)AppDomain.GetCurrentThreadId());
Console.ReadLine();
}
}
}
Вопросы
Когда мы используем ключевое слово await с, скажем, IВызов / O или вызов API, происходит ли операция ожидания только в главном потоке?
a) Если да, то почему основной поток (поток пользовательского интерфейса в случае GUI) продолжает работу с оставшейся частью метода одновременно?
b) Если нет, то это нарушает теорию асинхронного вызова без потоков и ждет.