2012-02-16 2 views
2

.Net 4クラスSystem.Threading.Tasksを使用して、いくつかの動作を検出しました。これは、この例で示すのが最善です:タスクレポートは完了しましたが、結果のブロックはまだありますか?

var t = FunctionThatReturnsTaskAsync(); 
Trace.TraceInformation("Completed: " + t.IsCompleted); 
return t.Result; 

出力:「が完了:真を」、しかし永遠t.Resultでブロック後、(かつて数千回のランで)コード。それは例外を返すかスローしません。どうすればいいの!

返されるタスクは完了するまでに数回かかるため、2行目で完了できることは驚くことではありません。謎はなぜt.Resultがブロックされているのかです。

+2

この関数はどのように実装されていますか? – CodesInChaos

+0

FunctionThatReturnsTaskAsync?それは、タスク.Factory.StartNew(()=> {}、CancellationToken.None)を呼び出して終了します。 – 4ZM

+2

Strange。問題を示す最小の例を投稿できますか? – CodesInChaos

答えて

1

非同期メソッドはタスク自身を返しますが、タスク<タスク< T>があり、内部タスクは 'async'のため '終了'の前に戻り、外部タスク<>は完了したとみなします。この上

参照スティーブンToubのブログ記事:

http://blogs.msdn.com/b/pfxteam/archive/2012/02/08/10265476.aspx

http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

私は、関連する引用引き出すことを許可:この効果を理解するために

を、私たちは覚えておく必要があります非同期メソッドがどのように動作するか。非同期メソッドを呼び出すと、同期メソッドが起動します。メソッドが待っていない場合、またはメソッドの待機中のすべてが待っている時間までに既に完了している待ち時間にある場合、メソッドは完全に同期して実行されます。しかし、メソッドがyieldに最初に遭遇すると、非同期メソッドが戻ります。 TaskまたはTaskを返す非同期メソッドの場合、このメソッドは非同期メソッドの実行を表すTaskまたはTaskを返し、呼び出し側はそのタスクを使用して同期を待つ(Wait()など)か、非同期に待機させることができますメソッドが非同期的に完了するために待機する(たとえば、待機する、ContinueWith)。しかし、voidメソッドの場合、ハンドルは返されません。したがって、非同期voidメソッドは「火災と忘れ」と呼ばれることがあります。

+0

.ENET 4.0について具体的に質問し、.NET 5について説明します。 – Fulproof

関連する問題