【发布时间】:2013-10-14 20:33:23
【问题描述】:
我有下面的代码,看起来 ApiClass 中的 await 语句会导致函数“AControllerMethodInAspMVC”在每个 api.GetResultFromAnotherService 完成之前提前返回。
主线程在所有子线程完成之前返回。有没有办法解决这个问题?
private ApiClass api = new ApiClass();
[HttpPost]
public Task<JsonResult> AControllerMethodInAspMVC()
{
var arrayOfItem = …;
List<object> resultObjs = new List<object>();
var resultLock = new SemaphoreSlim(1);
Parallel.ForEach(
arrayOfItem,
async item =>
{
var result = await api.GetResultFromAnotherService(item.id);
var resultObj = new {
// prepare resultObj from result
};
await resultLock.WaitAsync();
resultObjs.add(resultObj);
resultLock.Release();
});
return Task.FromResult(this.Json(resultObjs));
}
Public class ApiClass
{
Public async Task<string> GetResultFromAnotherService(string id)
{
….
…
await Call AnAsyncOperationToGetResult
…
…
}
}
【问题讨论】:
-
@M.Babcock 我不确定我理解你的意思。这是一个非常常见的用法。您可以假设 ApiClass 是 HttpClient 之上的包装器,并且您需要触发并行请求以从另一个 Web 服务获取一些信息。解决我的问题很容易。将 GetResultFromAnotherService 更改为不返回任务。但这最终会阻塞线程。这不是我想要的。
-
@shrimpy:根据你的例子,我强烈怀疑你没有
targetFrameworkset to4.5in your app.config。
标签: c# multithreading asynchronous .net-4.5 async-await