1

非同期チェーンの後に複数の CPU バウンド メソッドを順番に呼び出す必要があるこの非同期待機チェーンをどのように処理するのが最善なのか疑問に思っています。

以下に小さな例を入力しました。

私はちょうど最高のパフォーマンス/最も副作用の少ないパターンが何であるかを見つけようとしています. 非同期の利点を無効にしないようにしたい。私のフィルターメソッドは、非同期で待機可能なものにはアクセスしないため、非同期にするには、呼び出し元のメソッドで Task.Run(() => Filter1(criterion)) を返す必要があるか、 await Task.Run(() のようなものを返す必要があります=> { イベントを返す; }); フィルターメソッド自体で。問題は、ベスト プラクティスをどの方法で実行するかです。ほとんどの議論はここで終わるので、完全な例と推奨事項があればよいでしょう。

良いアドバイスをくれる 4.5 async await の専門家はいますか?

namespace test
{
    using System.Net;
    using System.Net.Http;
    using System.Threading.Tasks;
    using System.Web.Http;

    public class sampleController : ApiController
    {
        private Service _service;

        public sampleController()
        {
            _service = new Service();
        }

        public async Task<HttpResponseMessage> SomeTask(DiagnosesSearchCriterion criterion)
        {
            return Request.CreateResponse<IEnumerable<Diagnosis>>(HttpStatusCode.OK, await _service.GetDiagnosesByGroup(criterion));
        }
    }

    public class Service
    {
        private Repository _repository;

        public Service()
        {
            _repository = new Repository();
        }
        public async Task<IEnumerable<Diagnosis>> GetDiagnosis(DiagnosesSearchCriterion criterion)
        {
            System.IO.Stream events = await _repository.GetEvents(criterion);

            // Will these block? Should they be async? They are CPU bound... 
            // how to best handle this, they need to be called sequentially in most cases.
            events = Filter1(criterion, events);
            events = Filter2(criterion, events);

            return new Diagnosis[]{};
        }

        public System.IO.Stream Filter1(DiagnosesSearchCriterion criterion, System.IO.Stream events)
        {
            // CPU bound PLINQ and Parallel filtering logic here.....

            return events;
        }

        public System.IO.Stream Filter2(DiagnosesSearchCriterion criterion, System.IO.Stream events)
        {
            // CPU bound PLINQ and Parallel filtering logic here.....
            // ....

            return events;
        }
    }

    public class Repository
    {
        public async Task<System.IO.Stream> GetEvents(DiagnosesSearchCriterion criterion)
        {
            WebClient wc = new WebClient();
            return await wc.OpenReadTaskAsync("http://www.blah.com/stuff");
        }
    }
}
4

1 に答える 1

2

サーバー側での主な利点asyncスケーラビリティです。つまり、リクエストが I/O の完了を待っているだけの場合、スレッド プール スレッドはリクエストの処理から解放されます。

この場合 (メソッドが CPU バウンドである場合)、それらを作成してもメリットはありませんasyncTask.Run. _ それらは順番に実行する必要があるため、これを行う最も簡単な方法は、コードが現在実行しているように、それらを同期的に呼び出すことです。

このシナリオは、優れたAsync in ASP.NET video で対処されていると思います。クライアント側でのこの同じ状況は、異なる方法で処理されることに注意してください。クライアント側での主なメリットasync応答性です。そのため、CPU 作業をスレッド プール スレッド ( ) に放り込むことTask.Run理にかなっています。これにより、UI スレッドが解放されるからです。

(補足として、ユーザー数がかなり少ないことが確実でない限り、通常、サーバーで並列処理を行うことはお勧めできません)。

于 2013-03-14T22:15:46.817 に答える