私は一般的に、インターフェースを部分的に実装することに慎重です。ただし、IAsyncResult
いくつかのまったく異なる使用パターンをサポートしていることを考えると、これは少し特殊なケースです。を呼び出したり、 を使用したり、ポーリングしたりするのではなく、 AsyncState
/パターンをどのくらいの頻度で使用/使用していますか?AsyncCallback
EndInvoke
AsyncWaitHandle
IsCompleted
関連する質問: 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 ライブラリでは が実装されていますが、暗黙的に実装されているだけであることに注意してください。IAsyncResult
IsCompleted
AsyncState
{return null;}
IAsyncResult
Task
IAsyncResult
IsCompleted