gpt4 book ai didi

c# - .NET 4.5 中的异步服务外观

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:09 26 4
gpt4 key购买 nike

我刚刚升级到 .NET 4.5,我想利用异步方法功能。具体来说,我有一个 facade,它进行 4 个不同的 api 调用并将响应聚合到一个将从我的 Controller 返回的响应对象中。由于这 4 个调用不相关,它们可以异步完成并并行执行。我看过异步 Controller 的示例,但我希望并行调用发生在外观类本身中。这是我到目前为止所拥有的:

在 Facade.cs 中:

    public async Task<Dictionary<string, object>> AggregateServiceResponses(string authTicket)
{
var aggregateServiceResponse = new Dictionary<string, object>();
var asyncManager = new AsyncManager();

asyncManager.OutstandingOperations.Increment(4);

await Task<Dictionary<string, object>>.Factory.StartNew(() =>
{
return _membershipServiceManager.GetMemberResponse(authTicket);
}).ContinueWith(t =>
{
asyncManager.Parameters["memberInfoResponse"] = t.Result;
asyncManager.OutstandingOperations.Decrement();
});


await Task<KeywordingResponseObject[]>.Factory.StartNew(() =>
{
return _keywordingServiceManager.GetKeywordResponse();
}).ContinueWith(t =>
{
asyncManager.Parameters["Keywords"] = t.Result;
asyncManager.OutstandingOperations.Decrement();
});


await Task<FamilyResponseObject[]>.Factory.StartNew(() =>
{
return _familyServiceManager.GetFamilyResponse();
}).ContinueWith(t =>
{
asyncManager.Parameters["Family"] = t.Result;
asyncManager.OutstandingOperations.Decrement();
});


await Task<IEnumerable<Friends>>.Factory.StartNew(() =>
{
return _friendsServiceManager.GetFriendsResponse();
}).ContinueWith(t =>
{
asyncManager.Parameters["Friends"] = t.Result;
asyncManager.OutstandingOperations.Decrement();
});

//After all service calls complete...build composite response...

aggregateServiceResponse.Add("MemberInformation",asyncManager.Parameters["memberInfoResponse"]);
aggregateServiceResponse.Add("Keywords", asyncManager.Parameters["Keywords"] );
aggregateServiceResponse.Add("Family", asyncManager.Parameters["Family"]);
aggregateServiceResponse.Add("Friends",asyncManager.Parameters["Friends"]);

return aggregateServiceResponse;
}

最佳答案

您可以同时执行此操作:

var memberTask = Task.Run(() => ...);
var kewordTask = Task.Run(() => ...);
var familyResponseTask = Task.Run(() => ...);
var friendsTask = Task.Run(() => ...);

await Task.WhenAll(memberTask, keywordTask, familyResponseTask, friendsTask);

但是,我必须指出,不建议在 ASP.NET 上进行并行(CPU 绑定(bind))处理,除非您正在编写仅包含少量并发用户请求的仅供内部使用的服务。

您也不再需要使用 AsyncManager(或 AsyncController)。

关于c# - .NET 4.5 中的异步服务外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16965553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com