2016-10-31 13 views
0

click button eventは、最初にlistを "B"で、次に "A"で埋めます。'Task.Factory.StartNew'を使用した非同期wpfイベントは待機を待機しません

List<string> list = new List<string>(); 

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    await Task.Factory.StartNew(async() => 
    { 
     await Task.Factory.StartNew(() => Thread.Sleep(1000)); 

     list.Add("A"); 
    }); 

    list.Add("B"); 
} 

Q:どのように私はのawait非同期概念を使用して.Add( "B")の前に起こる.Add( "A")の実行を強制することができますか?

私が試した:

  1. を私はTaskvoidを交換しようとしたが、機能はその後、Clickイベントに割り当てることができませんでした。
  2. 私はTask.Wait()関数を試しましたが、少し複雑なケースではデッドロックが発生します。

注:これは単純化された例です。私は現実世界のコード私は非同期メソッドのシーケンスを呼び出している、すべてTaskオブジェクトを返すと、すべてが待たれている、と彼らはまだ必要な順序で実行されません。関数Task.Factory.StartNew()は全く同じ方法で私の実際のコードで使用されます。

答えて

4

a few reasons you shouldn't use Task.Factory.StartNewがありますが、その1つは、Func<Task>またはFunc<Task<T>>を受け入れる過負荷がないことです。

非同期のデリゲートを「理解」しないため、デリゲートの最初の同期部分が完了するとすぐに、つまりこの場合は最初のawaitになるとすぐに戻ります。

代わりにTask.Runを使用してください。

関連する問題