なんらかの理由で、は作業項目に やその他ThreadPool
のハンドルをQueueWorkItem
返さないためIAsyncResult
、作業が完了するまで待機することができます。メソッドはありRegisterWait...
ますが、a を渡す必要がWaitHandle
あり、それらの作成にはコストがかかります (ドキュメントを参照してください。要求さIAsyncResult
れるまで a の作成を遅らせることをお勧めします)。WaitHandle
Task Parallel Library はこの不足を修正しますが、それが利用可能になるまでには長い時間がかかります。では、この設計に問題はありますか。
public class Concurrent<T> {
private ManualResetEvent _resetEvent;
private T _result;
public Concurrent(Func<T> f) {
ThreadPool.QueueUserWorkItem(_ => {
_result = f();
if (_resetEvent != null)
_resetEvent.Set();
});
}
public WaitHandle WaitHandle {
get {
if (_resetEvent == null)
_resetEvent = new ManualResetEvent(_result != null);
return _resetEvent;
}
...
編集: ThreadPool の代わりに非同期デリゲートを使用するときに発生する懸念について、フォローアップの質問をしました。