2017-05-01 4 views
3

私はこのコードを実行すると、何もブロックがすべての罰金とダンディ、存在しない:C#なぜタスクはいつUIスレッドをブロックしますか?すべての行を待っているのではないでしょうか?

List<Category> cats = null; 
    cats = await cat.GetAllAsync();//no blocks here 
    cats = await cat.GetAllAsync();//no blocks here 
    cats = await cat.GetAllAsync();//no blocks here 
    cats = await cat.GetAllAsync();//no blocks here 
    cats = await cat.GetAllAsync();//no blocks here 

しかし、この他のコードがないと私は、なぜ得ることはありません、私はあなたの助けに感謝し、

var tasks = new List<Task>(); 
    tasks.Add(cat.GetAllAsync()); 
    tasks.Add(cat.GetAllAsync()); 
    tasks.Add(cat.GetAllAsync()); 
    tasks.Add(cat.GetAllAsync()); 
    tasks.Add(cat.GetAllAsync()); 
    await Task.WhenAll(tasks); //this blocks the UI thread 

EDIT: GetAllAsyncが非同期にsprocを実行することがわかりましたが、返されるDataSetからカテゴリのリストが作成されますが、そこには非同期は存在しませんので、メインスレッドはそれを選択して10万のカテゴリをバインドします。 UIをブロックする!ドゥー!助けのための

おかげで、

+0

[MCVE]ガイダンスを参照してください... (あなたが 'GetAllAsync'を複数回呼び出すことが安全であると仮定して、つまり' {Task.Yield(); return new List ();} 'のようなメソッド) –

答えて

4

は安全cat.GetAllAsync再入の\スレッドですか? 最初の例では、cat.GetAllAsyncに対する複数の呼び出しが順番に実行されます。 2番目の例では、cat.GetAllAsyncを複数回呼び出すと並行して実行できますが、cat.GetAllAsync内にロック\デッドロックが発生すると思われます。

関連する問題