从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服务中以异步模式移动此代码。
答案 0 :(得分:0)
使用基于Task
的异步API和async/await,如下所述:
Using Asynchronous Methods in ASP.NET MVC 4
避免使用await Task.Run()
打包同步通话,这是我的意思example。通常,您不需要在服务器端创建新线程或显式使用池线程。您可以使用Task.Factory.FromAsync
异步调用WCF服务,例如this。