加载异步结果的最快和优化方式

时间:2014-02-17 06:30:24

标签: c# asp.net performance wcf optimization

从Web服务中的各种来源加载异步结果的最快和最优化的方法是什么?

Dictionary<string, int> readySources = GetReadyHotelSources(member);

        eventFlag = new AutoResetEvent[readySources.Count];
        int maxTimeOut = 0;
        int i = 0;
        foreach (KeyValuePair<string, int> activeSource in readySources)
        {
            maxTimeOut = (int)activeSource.Value > maxTimeOut ? (int)activeSource.Value : maxTimeOut;
            i++;
        }
        int j = 0;            
        foreach (KeyValuePair<string, WaitCallback> deThread in listOfThreads)
        {
            if (readySources.ContainsKey(deThread.Key))
            {
                ThreadPool.QueueUserWorkItem(deThread.Value, j);
                eventFlag[j] = new AutoResetEvent(false);
                j++;                    
            }
        }

        if (j != 0)
        {
            if (!WaitHandle.WaitAll(eventFlag, new TimeSpan(0, 0, maxTimeOut), true))
            {
                //TODO: audit which thread is timed out                
            }
        }          
        // combined sources    
        result = CombineHotelSources();

现在我想在Web服务中以异步模式移动此代码。

1 个答案:

答案 0 :(得分:0)

使用基于Task的异步API和async/await,如下所述:

Using Asynchronous Methods in ASP.NET MVC 4

避免使用await Task.Run()打包同步通话,这是我的意思example。通常,您不需要在服务器端创建新线程或显式使用池线程。您可以使用Task.Factory.FromAsync异步调用WCF服务,例如this