2017-03-28 16 views
4

最近非同期メソッドを呼び出す際に問題が発生しました。ここ はコードです:非同期メソッドC#WhenAll issue

ClassA storage = new ClassA();// this is member of the class 

async Task<ClassA> InitClassAObject(){ // async method of the class 


    List<Task> taskList = new List<Task>(); // create list task 
     taskList.Add(Func1()); 
     taskList.Add(Func2()); 
     taskList.Add(Func3());    

     await Task.WhenAll(taskList.ToArray()); // wait for all task done 

     return storage; // <--- this line never be hit 
} 

async Task Func1(){ 
     await Task.Run(() =>{ 
      //update property A of storage 
      //example storage.A = GetDataFromSomeWhere(); 
    }); 
} 

async Task Func2(){ 
     await Task.Run(() =>{ 
      //update property B of storage 
      //example storage.B = GetDataFromSomeWhereElse(); 
    }); 
} 
... 

は質問1:方法InitClassAObject()を返すことはありません。 "return never"ヒット時のブレークポイント。

質問2:複数の非同期メソッドを呼び出すと、オブジェクトClassAのさまざまなプロパティが更新されます。それは安全ですか?

私は解決策を探していますが、それでも見つからないのです。 ありがとうございます。

+2

すべてのタスクが完了しないことはありますか? – Magnus

+2

'Func1'、' Func2'、 'Func3'は何をデバッグしましたか? 'return storage' _never_がヒットした場合、それらのタスクの少なくとも1つが完了していない可能性が高いからです。 –

+0

コメントありがとうございます。これは私が同期的にFunc1()を呼び出すときに使用されました。 Funct2(); ..その後、私はこのアプローチに切り替え、それはもはや動かない。そして、私はそれらの機能に間違いがないと思います。しかし、私はそれらをもう一度確かめるでしょう。 –

答えて

2

質問2について:異なるプロパティを更新することは安全です。しかし、Task1のSomePropertyを読んでTask2で修正すると結果が予測できないことに注意してください。(Task1はTask2の前または後に読み込むことができます)

+0

大変ありがとうございます。私は心に留めておきます。 –

3

デッドロックが発生する可能性があるため、関数は同じソース(オブジェクト)を使用していますか?あなたは同じオブジェクトを使用して結果を見ることはできませんか?

+0

ありがとうございます。自分のコードの1つが完了しなかったことがわかりました。ところで、今は動作しますが、オブジェクトの非同期的な変更(さまざまなプロパティ)が問題を引き起こす可能性があることは、まだ残念です。 –

関連する問題