@rFczZZ

Почему асинхронный метод работает как отдельный поток?

Добрый день. Я пытаюсь понять как работают async/await. В коде ниже: два цикла один рисует число на первой строке консольного окна, второй - на второй. Поскольку функция ShowMessage сохраняет и восстанавливает состояние, то она не должна конфликтовать сама с собой откуда бы ее не вызывали "синхронно" (что, я полагаю, должен делать механизм async/await, т.е. он должен прерывать основной поток где бы он не находился и вызывать эту функцию в этом потоке, затем возвращать управление обратно). Но запустив приложение можно видеть, что текст выводится куда попало, как было бы при конфликте потоков.

Подскажите, что я делаю не так?

public static void Main()
{
    DrawCounter();
    while(true) ShowMessage(DateTime.Now);              // A
}

public static async void DrawCounter()
{
    int counter = 0;
    while(true)                                         // B
    {
        ShowMessage(counter++, 0, 1, ConsoleColor.Red);
        await Task.Delay(1);                            // C
    }
}

public static void ShowMessage(object Message, int Left = 0, int Top = 0, 
    ConsoleColor Color = ConsoleColor.Gray)
{
    int oldLeft = Console.CursorLeft;
    int oldTop = Console.CursorTop;
    var oldColor = Console.ForegroundColor;

    Console.ForegroundColor = Color;
    Console.SetCursorPosition(Left, Top);
    Console.Write(Message);

    Console.CursorLeft = oldLeft;
    Console.CursorTop = oldTop;
    Console.ForegroundColor = oldColor;
}
  • Вопрос задан
  • 338 просмотров
Решения вопроса 1
1. Поток не прерывается.
2 DrawCounter();
нужно скорее всего делать
DrawCounter().Wait()
или
await DrawCounter();

Иначе после первого await внутри DrawCounter
управление попадает сразу сюда while(true) ShowMessage(DateTime.Now);

3. Имеет значение контекст ,в гуи потоке по умолчанию по окончанию нового таска после await управление передается опять в поток гуи, здесь такого не будет.

Дальше рекомендую погуглить и почитать подробнее. Лень много печатать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы