小编Ber*_*rtC的帖子

c#线程异步问题

我有一些代码,当被调用时调用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#

7
推荐指数
1
解决办法
342
查看次数

标签 统计

c# ×1