非同期チェーンの後に複数の 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");
}
}
}