私は、Webサービスをクライアントに公開する単純なサーバーに取り組んでいます。一部のリクエストは完了するまでに長い時間がかかる場合があり、論理的に複数のステップに分割されます。このような要求については、実行中に進捗状況を報告する必要があります。さらに、前のリクエストが完了する前に新しいリクエストが開始される可能性があり、両方を同時に実行する必要があります(システム固有の制限を除く)。
サーバーにTaskIdをクライアントに返してもらい、クライアントにTaskIdを使用してリクエストの進行状況を追跡させることを考えていました。これは良いアプローチだと思います。タスクの管理方法の問題が残っています。
TPLを使ったことがないので、この問題に取り組むのに良い方法だと思いました。実際、スレッドを手動で管理しなくても、複数のタスクを同時に実行できます。ContinueWithを使用すると、比較的簡単にマルチステップタスクを作成することもできます。
ただし、タスクの進行状況を追跡するための良い方法を思い付くことができません。私のリクエストが単一の「ステップ」で構成されている場合、そのステップは協力してその状態を報告する必要があることを認識しています。これは、現時点では避けたいものです。ただし、リクエストが複数のステップで構成されている場合は、現在実行中のステップを知り、それに応じて進捗状況を報告したいと思います。私が思いつくことができる唯一の方法は非常に面倒です:
Task<int> firstTask = new Task( () => { DoFirstStep(); return 3.14; } );
firstTask.
ContinueWith<int>( task => { UpdateProgress("50%"); return task.Result; } ).
ContinueWith<string>( task => { DoSecondStep(task.Result); return "blah"; }.
ContinueWith<string>( task => { UpdateProgress("100%"); return task.Result; } ).
また、UpdateProgressに既知の場所を更新させるのではなく、タスクに独自の進行状況を保存させたいので、これでも完全ではありません。さらに、新しいステップを追加するときに多くの場所を変更しなければならないという明らかな欠点があります(現在、進捗状況は50%、100%ではなく33%、66%、100%です)。
誰かが良い解決策を持っていますか?
ありがとう!