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(задача, метод) выполниться.
}