例えば、我々は、加算機能と機能の実行結果は、UIに表示されて実行します。我々は、次を使用することができます。
1 プライベート ボイド Button_Click_2(オブジェクト送信者、RoutedEventArgs E) 2 { 3 txtDisplay.Text = NULL ; 4 ディスプレイ(「積算開始」)。 5 6 INTの和=総和(1000年 * 2 )。 7 8 表示($ " 集計結果:{和} " ); 9 } 10 11 プライベート INT総和(INT N) 12 { 13 int型の和= 0 。 14 のために(INT iが= 0 ; iが<N; iが++ ) 15 { 16 和+ = I。 17 System.Threading.Thread.Sleep(1 )。 18 } 19 20 戻り和。 21 }
ここでのコードに問題がある。しかし、それは、この問題を解決するために、UIスレッドをブロック機能を合計のタスクの作業を開始し、タスクが完了したので、その結果は合計に返されます。
1 プライベート ボイド Button_Click(オブジェクト送信者、RoutedEventArgs E) 2 { 3 txtDisplay.Text = NULL ; 4 ディスプレイ(「総和0スタート」)。 5 6 INTの和= SummationAnsyc0(1000年 * 2 )。 7 8 表示($ " 総和0結果:{和} " ); 9 } 10 11 プライベート INT SummationAnsyc0(int型N) 12 { 13 タスク< INT >タスク=タスク< INT > .Factory.StartNew(()=> 14 { 15 int型の合計= 0 ; 16 用(INTは iは= 0、I <N; I ++ ) 17 { 18 の合計+ = I; 19 System.Threading.Thread.Sleep(1 ); 20 } 21 22 戻り和; 23 })。 24 25 返すtask.Resultを。 26 }
しかし、この機能の実装は、我々は、タスクのタスクが返す結果を結果ので、タスクがまだ終わっていない場合とき、それは完全なタスクを待ち、メインUIスレッド上task.Resultリターンを返しますが、それはまた、メインUIスレッドをブロックされていることを見つけますしたがって、UIスレッドをブロックします。
だから、どのようにそれを達成するために必要な結果を返すことが必要であるが、それは現在のスレッドをブロックしませんか?
その答えは、支持体上の必要性の.NET4.5(C#5.0以降)のawait /非同期を使用することです。
1つの プライベート 非同期 空隙 Button_Click_1(オブジェクト送信者、RoutedEventArgs E) 2 { 3 txtDisplay.Text = NULL ; 4 5 ディスプレイ(" 総和1開始" )。 6 7 INTの和=を待つ TaskAnsyc1(1000年 * 3 )。 8 9 表示($ " 集計結果1:{和} " ); 10 } 11 12 プライベート 非同期タスク< INT > TaskAnsyc1(INT N) 13 { 14 タスク< INT >タスク= Task.Factory.StartNew(()=> 15 { 16 のint =和0 ; 17 用(INT iは= 0、I <N; I ++ ) 18 { 19 和+ = I; 20 System.Threading.Thread.Sleep(1 ); 21 } 22 23 戻り和。 24 }); 25 26 リターン のawaitのタスク。 27 }
結果は、通常の実行以下の図になりますが、UIスレッドをブロックしません。