为什么我的异步任务彼此等待完成?

时间:2018-08-09 02:22:53

标签: c# .net wpf multithreading async-await

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 个答案:

答案 0 :(得分:1)

查看此MSKB文章: WCF service may scale up slowly under load

总而言之,您的WCF服务的默认IOCP线程池似乎正在挨饿(很难说出原因;用ThreadPool.GetMinThreadsThreadPool.GetAvailableThreads检查)。因此,很可能在服务Thread.Sleep时用_wcfProxy.A()阻止WCF线程时,没有其他线程可服务_wcfProxy.B(),因此B请求被排队,直到A已完成。

尝试按照该文章所述实现WorkerThreadPoolSynchronizerWorkerThreadPoolBehaviorAttribute,将[WorkerThreadPoolBehavior]应用到AB,看看是否可以解决问题。< / p>