Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#为什么任务会阻塞UI线程?但不是每一行都在等待?_C#_Asynchronous - Fatal编程技术网

C#为什么任务会阻塞UI线程?但不是每一行都在等待?

C#为什么任务会阻塞UI线程?但不是每一行都在等待?,c#,asynchronous,C#,Asynchronous,当我运行此代码时,没有任何块,都很好: 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();/

当我运行此代码时,没有任何块,都很好:

    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
List cat=null;
cats=等待cat.GetAllAsync()//这里没有街区
cats=等待cat.GetAllAsync()//这里没有街区
cats=等待cat.GetAllAsync()//这里没有街区
cats=等待cat.GetAllAsync()//这里没有街区
cats=等待cat.GetAllAsync()//这里没有街区
但是其他的代码可以,我不明白为什么,我感谢你的帮助

    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
var tasks=newlist();
tasks.Add(cat.GetAllAsync());
tasks.Add(cat.GetAllAsync());
tasks.Add(cat.GetAllAsync());
tasks.Add(cat.GetAllAsync());
tasks.Add(cat.GetAllAsync());
等待任务。何时(任务)//这将阻止UI线程
EDIT:我意识到GetAllAsync异步执行存储过程,但随后它从返回的数据集创建了一个类别列表,但其中没有异步,因此主线程会选择并绑定十万个类别!这阻碍了用户界面!啊


感谢您的帮助,

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

请查看指南。。。如图所示的代码无法演示您声明的行为(假设并行多次调用GetAllAsync是安全的-例如,对于{Task.Yield();return new List();}