为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的异步任务在等待另一个完成?

为什么我的异步任务在等待另一个完成?

C#
万千封印 2021-11-21 14:33:25
private async void StartTasks_Click(object sender, RoutedEventArgs e) {    await Task.WhenAll(GetSomeData());    lblResult.Text = "Got data?";}private async Task GetSomeData(){    System.Net.ServicePointManager.DefaultConnectionLimit = 16;    ServiceClient _proxy = new ServiceClient();    //*** the wcf proxy service methods just sleep for 5 seconds.    var t1 = _wcfProxy.A();    var t2 = _wcfProxy.A();    var t3 = _wcfProxy.A();    var t4 = _wcfProxy.A();    await Task.WhenAll(t1,t2,t3,t4);}当我点击我的按钮时,我希望我的标签文本被设置5 seconds(因为我的 WCF 方法调用只是休眠 5 秒)。嗯,它需要10 seconds。现在,当我只进行三个服务调用而不是四个时,标签设置在5 seconds.当我在进行所有四个调用时查看性能监视器中的调用计数时,我只看到 3 个进入,然后在前三个完成后其他 1 个进入。
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

总而言之,您的 WCF 服务的默认 IOCP 线程池似乎正在耗尽(很难说出原因;请检查ThreadPool.GetMinThreadsThreadPool.GetAvailableThreads)。因此,最有可能的是,当您使用Thread.Sleepwhile services 阻塞 WCF 线程时_wcfProxy.A(),没有另一个线程可用于 serve _wcfProxy.B(),因此B请求会排队等待,直到A完成。

尝试实现WorkerThreadPoolSynchronizerWorkerThreadPoolBehaviorAttribute按照该文章中的描述,应用[WorkerThreadPoolBehavior]AandB并查看是否可以解决问题。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信