Lucian 在这里讨论了一种模式(提示 3:在返回任务的 API 中包装事件并等待它们)。
我正在尝试在一个经常调用的方法上实现它,该方法看起来像下面的人为代码:
public Task BlackBoxAsync()
{
var tcs = new TaskCompletionSource<Object>(); // new'ed up every call
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
DoSomethingStuff();
tcs.SetResult(null);
}
catch(Exception exc) { tcs.SetException(exc); }
});
return tcs.Task;
}
我担心性能,TaskCompletionSource
每次调用都会更新(假设我每 100 毫秒调用一次此方法)。
然后我正在考虑BufferBlock<T>
改用,认为它不会在每次通话时都被更新。所以它看起来像:
private readonly BufferBlock<object> signalDone; // dummy class-level variable, new'ed up once in CTOR
public Task BlackBoxAsync()
{
ThreadPool.QueueUserWorkItem(_ =>
{
try
{
DoSomethingStuff();
signalDone.Post(null);
}
catch(Exception exc) { }
});
return signalDone.ReceiveAsync();
}
调用对象会这样称呼它:
for (var i=0; i<10000; i++) {
await BlackBoxAsync().ConfigureAwait(false);
}
有没有人有任何关于使用的想法BufferBlock<T>
?