Таймеры в Windows имеют разрешение прибл. 16 мс, поэтому любая задержка ниже 16 мс не может быть точно достигнута. Это относится к любому таймеру - таймеры .NET - это просто оболочки для собственных таймеров Windows.
Вместо ожидания занятости в цикле создайте пользовательский TaskCompletionSource<T>
и верните Task
, который можно ожидать.
class OutputRetriever
{
private readonly ConcurrentBag<string> _allMessages = new ConcurrentBag<string>();
private readonly TaskCompletionSource<string[]> _taskSource
= new TaskCompletionSource<string[]>();
// Note: this method is not async anymore
public Task<string[]> GetAllOutput()
{
// We just return a task that can be awaited
return _taskSource.Task;
}
void ConsoleDataReceived(object sender, DataReceivedEventArgs e)
{
_allMessages.Add(e?.Data);
if (e?.Data == "success")
{
// Here we notify that the task is completed by setting the result
_taskSource.SetResult(_allMessages.ToArray());
}
}
}
Теперь клиенты могут просто ожидать результатов какобычно:
var receiver = new OutputReceiver();
string[] messages = await receiver.GetAllOutput();