c# – Task.WhenAll没等

c# – Task.WhenAll没等,第1张

概述我正在学习如何在控制台应用程序中使用异步函数,但无法使Task.WhenAll等到所有任务完成.以下代码有什么问题?它同步工作.先感谢您. static void Main(string[] args){ ... IncluiValores(...); ...}static async void IncluiValores(...){ Task<List< 我正在学习如何在控制台应用程序中使用异步函数,但无法使Task.WhenAll等到所有任务完成.以下代码有什么问题?它同步工作.先感谢您.
static voID Main(string[] args){    ...    IncluiValores(...);    ...}static async voID IncluiValores(...){    Task<List<int>> res1 = att.GetAIDBAPI(att);    Task<List<int>> res2 = att.GetAIDBAPI(att2);    List<int>[] res = await Task.WhenAll(res1,res2);    ...}

更新 – 功能定义:

public async Task<List<int>> GetAIDBAPI(Attributes attributes)    {        List<int> results = null;        Connections clIEnt0 = new Connections();        httpClIEnt clIEnt = clIEnt0.OpenAPIConnection(attributes.User[0],attributes.Pwd,attributes.Server,attributes.Chave,attributes.Server2);        httpResponseMessage response = await clIEnt.PostAsJsonAsync("API/Attributes/ID/Bulk",attributes);        if (response.IsSuccessstatusCode)        {            var content = await response.Content.ReadAsstringAsync();            results = JsonConvert.DeserializeObject<dynamic>(content).ToObject<List<int>>();        }        else        {            var content = "[{-1}]";            var result = JsonConvert.DeserializeObject<dynamic>(content);            results = result.ToObject<List<int>>();        }        return results;    }

更新2 – 单独的上下文

static voID Main(string[] args){    AsyncContext.Run(() => MainAsync(args));}static async voID MainAsync(string[] args){    await IncluiValores(...);}static async Task IncluiValores(...){    Task<List<int>> res1 = att.GetAIDBAPI(att);    Task<List<int>> res2 = att.GetAIDBAPI(att2);    List<int>[] res = await Task.WhenAll(res1,res2); // <- Error here     //Collection was modifIEd; enumeration operation may not execute    ...}//TrIEd to change to code below but it does not wait.static async Task IncluiValores(...){    Task<List<int>> res1 = att.GetAIDBAPI(att);    Task<List<int>> res2 = att.GetAIDBAPI(att2);    await Task.WhenAll(res1,res2); // <- No error,just doesn't wait.     List.Add(res1.Result[0]);}
解决方法 您正在调用异步voID方法,这本身就意味着您无法等待结果.无论何时省略等待,都会破坏同步链.该 *** 作实际上是异步发生的,而不是通过await“重新同步”.控件返回给调用者,而(将来的某个时间) *** 作将异步恢复.

记住,等待是回归.只有await的一致使用才能为您提供同步.停止使用async voID – 将其更改为async Task并确保正确等待结果.您的MainAsync方法也是如此.任务是异步方法的缺失.

只有一种情况,你应该看到async voID,这是在遗留框架的事件处理程序的同步上下文中(例如在Winforms中).如果async方法可以返回一个Task,那么它确实应该.不要打破链条.

总结

以上是内存溢出为你收集整理的c# – Task.WhenAll没等全部内容,希望文章能够帮你解决c# – Task.WhenAll没等所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1247060.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存