2016-05-04 6 views
3

スカラにはPromisesFuturesがあります。 Futureが完了したときにPromiseで、私は、すなわちScala Promiseの同等の#

val p = Promise[Int]() 
val fut: Future[Int] = p.future // I already have a running Future here 

// here I can do whatever I want and when I decide Future should complete, I can simply say 
p success 7 
// and fut is now completed with value 7 

がどのように私はC#Task APIと同様の結果を得ることができ、制御することができますか?私はドキュメントで同等のものを見つけることができませんでした。

私はテストでこれを使用したいと思っています。模擬されたオブジェクトはTaskを返してから、タスクが完了する前に何らかの条件が満たされているかどうかを確認し、完了して別の条件を確認します。

答えて

3

あなたはTaskCompletionSource<T>を使用することができます。

void Main() 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    tcs.SetResult(true); 
    Console.WriteLine(tcs.Task.IsCompleted); // prints true. 
} 
0

私はあなたが作業している必要があるものだと思います。詳細はhereをご覧ください。

Task<int> futureB = Task.Factory.StartNew<int>(() => F1(a)); 
    int c = F2(a); 
    int d = F3(c); 
    int f = F4(futureB.Result, d); 
    return f; 

try/catchを使用すると、発生する可能性のあるエラーを管理できます。
出力値を強制するには、上記のように別のユーザーがTaskCompletionSourceを使用できます。

+0

私はタスクを知っています、私は私の質問に記載されています。 –

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 12239926) –

+0

私はもう少し答えを詳述しました。フィードバックをありがとう@PieterVandenheede – fborges42

0

のYuvalはTaskCompletionSourceが約束され、TaskFutureですが、C#のにあなたがTaskCompletionSourceを使用しないことはほとんど必要があることに注意して、言ったようにそれはTaskCompletionSource

です。

TaskCompletionSourceは、非タスクAPIをタスクベースのAPIに変換するために使用されるためです。 C#では、ほぼすべてのAPIが既にTask - 返送中です。

C#では、類似している間にほとんどTaskCompletionSource(scalaのPromiseが共通)が必要です。

void Fn() 
{ 
    var task = Task.FromResult(true); 
    Console.WriteLine(task.IsCompleted); // prints true. 
    Console.WriteLine(task.Result); // prints true. a ""blocking"" API 
} 
:あなたはおそらく、あなたがTaskCompletionSourceをしたくないタスクをモックAPIを作成したい場合は、あなたが FromResultをしたい FromResult

を探している

することは値に基づいて、完了したタスクを作成します

+0

今まで私が遭遇したことは、あなたがCでscalaを保持していることと同じですが、Promiseの使用法は同じで、主にFuturesを使用します。あなたが私の質問を振り返ってみると、私は完了していないタスクが必要であり、完了した時点を決定すると言いましたが、これは一般的な使用法ではありませんが、テストのために必要です。 –

+0

@Łukaszうまくいけば、Scalaの未来は共通ですが、_everywhere_ではなく、変換する必要のあるJava APIとコールバックAPIを使用する場所がたくさんあります。C#_ここ1年で作成されたすべてのAPI_は大きな基本クラスライブラリ。また、C#では、ほとんどの場合、 'async/await'でタスクを使うべきです。 –

+0

@Łukaszでも、ほとんどのものには 'Task.'ユーティリティメソッドがあります。それが非同期だと言うと、IO上で非同期ですか?あなたは 'タスクも持っています。(おそらく通常は)別のスレッドで実行されているかどうかをテストするだけであれば、「実行」します。 –