我有一些代码,当被调用时调用webservice,查询数据库并从本地缓存中获取值.然后它将这三个动作的返回值组合在一起以产生结果.我不是按顺序执行这些操作,而是想并行异步执行它们.这是一些虚拟/示例代码:
var waitHandles = new List<WaitHandle>();
var wsResult = 0;
Func<int> callWebService = CallWebService;
var wsAsyncResult = callWebService.BeginInvoke(res => { wsResult = callWebService.EndInvoke(res); }, null);
waitHandles.Add(wsAsyncResult.AsyncWaitHandle);
string dbResult = null;
Func<string> queryDB = QueryDB;
var dbAsyncResult = queryDB.BeginInvoke(res => { dbResult = queryDB.EndInvoke(res); }, null);
waitHandles.Add(dbAsyncResult.AsyncWaitHandle);
var cacheResult = "";
Func<string> queryLocalCache = QueryLocalCache;
var cacheAsyncResult = queryLocalCache.BeginInvoke(res => { cacheResult = queryLocalCache.EndInvoke(res); }, null);
waitHandles.Add(cacheAsyncResult.AsyncWaitHandle);
WaitHandle.WaitAll(waitHandles.ToArray());
Console.WriteLine(string.Format(dbResult, wsResult, cacheResult));
Run Code Online (Sandbox Code Playgroud)
问题是最后一行抛出一个错误,因为dbResult在执行时仍然为null.一旦调用queryDB.EndInvoke,就会发信号通知WaitHandle,并且在将queryDB.EndInvoke的结果分配给dbResult之前继续执行.这周围有一个整洁/优雅的方式吗?
注意:我应该补充一点,这只会影响dbResult,因为queryDB是要发出信号的最后一个等待句柄.
更新:虽然我接受了菲利普的回答,这很好,在安德烈的评论之后,我应该补充一点,这也有效:
var waitHandles = new List<WaitHandle>();
var wsResult …Run Code Online (Sandbox Code Playgroud) c# ×1