私は一般的に、インターフェースを部分的に実装することに慎重です。ただし、IAsyncResultいくつかのまったく異なる使用パターンをサポートしていることを考えると、これは少し特殊なケースです。を呼び出したり、 を使用したり、ポーリングしたりするのではなく、 AsyncState/パターンをどのくらいの頻度で使用/使用していますか?AsyncCallbackEndInvokeAsyncWaitHandleIsCompleted
関連する質問: ThreadPool WorkItem が完了したことを検出する/完了を待機しています。
このクラスを検討してください(非常に近似、ロックが必要です):
public class Concurrent<T> {
private ManualResetEvent _resetEvent;
private T _result;
public Concurrent(Func<T> f) {
ThreadPool.QueueUserWorkItem(_ => {
_result = f();
IsCompleted = true;
if (_resetEvent != null)
_resetEvent.Set();
});
}
public WaitHandle WaitHandle {
get {
if (_resetEvent == null)
_resetEvent = new ManualResetEvent(IsCompleted);
return _resetEvent;
}
public bool IsCompleted {get; private set;}
...
(ドキュメントで説明されているように、遅延して作成された)とがWaitHandleありますが、 (?)の賢明な実装は見当たりません。それで、それを実装するのは理にかなっていますか? Parallel Extensions ライブラリでは が実装されていますが、暗黙的に実装されているだけであることに注意してください。IAsyncResultIsCompletedAsyncState{return null;}IAsyncResultTaskIAsyncResultIsCompleted