TaskCompletionSource и System.Timers.Timer выполнить задачу не блокируя консольный ввод

        public Task<int> AwaitCompletion()
    {
        tcs = new TaskCompletionSource<int>();
        timer = new(10000)
        {
            AutoReset = true,           
        };

        timer.Start();

        timer.Elapsed += (s,e) => tcs.TrySetResult(0);
        return tcs.Task;
    }

    public static async Task Main()
{
    TimerService timerService = new TimerService();

    var result = await timerService.TestAwait();

    Console.WriteLine("Test");
}

Что я хочу получить:

По событию таймера выполнить:

 var result = await timerService.TestAwait();

и не ожидая его завершения перейти к:

    Console.WriteLine("Test");

Сейчас после вызова TestAwait() консоль блокируеться на указанные в таймере интервал (10с) и только после этого выполняеться:

Console.WriteLine("Test");

Что я делаю не так и как это можно исправить?

Спасибо!


Ответы (1 шт):

Автор решения: Faris

Если вы не хотите его ожидать, то await указывать стоит там, где вы его хотите ожидать, а в других случаях можно делать так:

public static async Task Main()
{
    TimerService timerService = new TimerService();
    var Task1 = timerService.TestAwait(); // Таким образом он запускается в "параллельном режиме".
    Console.WriteLine("Test");
    // И когда нам понадобиться значение этого кода, мы начинаем ожидать выполнение метода
    var Result = await Task1; // кейвордом await, мы как бы говорим то что нужно подождать пока этот Task(задача, метод) выполниться.
}
→ Ссылка