这里讨论了Lucian提出的一种模式(Tip 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>
的想法?
SqlCommand
)。 - Scott Chamberlain