1

現在、受信データに対して一連の「ルール」を実行するサービス メソッドがあります。これらのルールには、ID 番号の検証などの簡単なチェックを実行するものもあれば、データベースにアクセスして情報を検索するものもあります。次のようになります。

public void RunRules(ValidationRequest request)
{
    // Each rule returns bool for this example
    var rules = GetRules();

    var results = List<bool>();

    Parallel.ForEach(rules, rule =>
    {
        var result = rule();

        lock(results)
            results.Add(result);
    });

    foreach(var result in results)
    {
        RecordResultInDatabase(result);
    }

    CallNextService(someNewRequest);
}

を使用して物事を改善できると思います(確かではありません)async/await。私の考えでは、1 つのルールが終了するとRecordResultInDatabase、他のルールがまだ実行されている間に呼び出すことができます。

ただし、要件として、CallNextServiceすべてのルールが実行され、その結果がデータベースに記録されるまで、呼び出しが発生することは望ましくありません。

問題は、私が絶対的な初心者であり、私が探しているものasync/awaitである可能性があると思います(しかし確信はありません) 。Task.WaitAll

これがどのように行われるかは非常にわかりませんが、次のようなものだと推測しています。

List<Task<bool>> ruleTasks = GetRules();
Task.WaitAll(ruleTasks);

// Somehow get the results of the rules and record them in the db???
4

2 に答える 2

4

私は思いませんasync-awaitあなたの場合、パフォーマンスが向上します。つまり、async-awaitは次の 2 つの場合に役立ちます。

  1. GUI アプリケーションの応答性を向上させる。
  2. サーバー アプリケーションのスケーラビリティを向上させる。

どちらもあなたのケースではないようですので、コードでasync-を使用する理由はありません。await

すべての要求が完了したときではなく、要求の処理中に呼び出したい場合はRecordResultInDatabase()、 の代わりに PLINQ を使用できますParallel.ForEach()。別の利点として、コードも簡素化されます。

var results = GetRules().AsParallel().Select(rule => rule());

foreach (var result in results)
{
    RecordResultInDatabase(result);
}
于 2013-10-07T09:24:38.287 に答える