Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
当我运行此代码时,没有任何块,都很好,很花哨:

    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


编辑:我已经意识到GetAllAsync异步执行该sproc,但随后它从它返回的数据集中创建了一个类别列表,但那里没有异步,因此主线程选择了该类别并绑定了十万个类别!这会阻塞UI! h!

谢谢您的帮助,

最佳答案

cat.GetAllAsync可重入\线程安全吗?
在第一个示例中,对cat.GetAllAsync的多次调用是按顺序运行的。
在您的第二个示例中,可能对cat.GetAllAsync的多个调用可以并行运行,我的猜测是这会导致cat.GetAllAsync内部出现锁\死锁。

10-06 02:44