2011-06-27 20 views
1

私は非同期的に値を取得してカプセル化し、私はウェブ上で最も既存の実装は、このような契約を持って気づいたジェネリックFuture<T>クラス書いている:私の一般的なFutureの実装にはCompletedイベントが必要ですか?

public class Future<T> 
{ 
    public Future(Func<T> func); // kicks off the async operation 
    public T Value { get; } // gets the value and blocks if the async operation isn't done 
} 

これはすぐに私が完了を追加したくなりますイベントを実装に渡して、非同期の値を取得したいときに値をポーリングする必要がなく、完了した時点を知る必要があります。私はParallel Programmingライブラリが先物をこのように実装していることに気付きましたが、多くの実装でこのイベントが発生しない理由は不思議でした。何か不足していますか?先物に完了予定があるかどうか?それともあなたの文脈に依存するだけですか?

+2

なぜあなた自身の「タスク」を書いていますか? – svick

+1

@svick .NET 2.0が必要なアプリケーションで作業しているので、タスクにアクセスすることはできません

答えて

2

先物のコンセプトは多少混乱していると思います。私の意見では未来のポイントは、そうでなければ順次スタイルのコードでは非同期的に計算されている値を使うことができるということです。より明白な非同期スタイルが必要な場合は、それが継続継承のためのものです。

しかし、私はあまりにも上手くいかないという苦情はありません。 .NETのTaskクラスは両方のスタイルのサポートを結合しており、これまで私は完全に満足していました。私は2つのスタイルを別々にしておくようにしています。タスクを強制する予定がある場合は、それに継続を割り当てることを避けることを好みます。逆もまた同様です。

3

このようなことをイベントとして、またはa method that accepts delegate to the continuationとすると、汎用のFuture<T>で便利だと思います。特定の目的のためだけに構築しているのであれば、必要ではないかもしれません。

また、ネット上の例は、本質的なものであり、本番品質のコードではないことが多く、実際には必要ではないが、このような有用な機能は欠落する可能性があることに注意してください。

もう1つ注目すべきことは、この機能が既にTask<T>の形式でフレームワークに存在するため、作業がまったく必要ない可能性があることです。

関連する問題