1
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 个在前三个完成后进来。

4

1 回答 1

1

查看此 MSKB 文章:WCF 服务可能会在负载下缓慢扩展

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

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

于 2018-08-09T03:40:46.433 回答