1

.NET 4.5 にアップグレードしたばかりで、非同期メソッド機能を利用したいと考えています。具体的には、4 つの異なる API 呼び出しを行い、コントローラーから返される単一の応答オブジェクトに応答を集約するファサードがあります。これら 4 つの呼び出しは関連していないため、非同期で実行し、並行して実行できます。非同期コントローラーの例を見てきましたが、並列呼び出しをファサード クラス自体の中で発生させたいと考えています。これは私がこれまでに持っているものです:

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;
    }
4

1 に答える 1