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[]>();
public Task<string[]> GetAllOutput()
{
return _taskSource.Task;
}
void ConsoleDataReceived(object sender, DataReceivedEventArgs e)
{
_allMessages.Add(e?.Data);
if (e?.Data == "success")
{
_taskSource.SetResult(_allMessages.ToArray());
}
}
}
现在客户可以像往常一样等待结果:
var receiver = new OutputReceiver();
string[] messages = await receiver.GetAllOutput();