0
我有下面的代码,看起来像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更改为不返回任务。但是这最终会阻止线程。这不是我想要的。 – jojo
@shrimpy:根据你的例子,我强烈怀疑你的app.config中没有['targetFramework'设置为'4.5'](http://blogs.msdn.com/b/webdev/archive/2012 /11/19/all-about-httpruntime-targetframework.aspx)。 –