3

私は、長時間実行される操作を処理するために言及された方法のいずれかを使用することを検討しています。

これらのそれぞれを使用して何が達成できるかについては詳しく説明しませんが、私が何をしたいのかを説明したいと思います。

HTTP関連のメソッドのセットがあり、それぞれがいくつかの情報を取得します。これはすべて、長時間実行されるサービス内のより大きなシステムの一部です(したがって、1回限りの使い捨てコードではありません)。

一般に、カプセル化と保守性の観点から、どちらのアプローチが優れていますか。Begin/ End / AsyncCallbackメカニズムを使用して準備ができたときに返されたデータを処理するか、各イベントの派生EventArgsクラスを使用してOnXXXReceived、OnXXXErrorなどのタスク内からイベントを発生させますか?

十分に明確になっていることを願っています。特定の実装のヒントよりも、意見、アドバイス、および起こりうる落とし穴に関心があるため、コードサンプルを提供しないことにしました。

ありがとう!

4

3 に答える 3

2

一般に、TPL タスクの方がはるかに使いやすいです。あなたの場合、Factory および LongRunning オプションを使用してそれらを作成します。

ただ、イベントに関してはよくわかりません。Request/Rresponse をループなどで処理してみませんか? あなたはすでにスレッドにいます。

于 2010-06-15T14:30:48.093 に答える
1

フェッチ タスクが完了したら、ContinuationTasks を使用してデータを処理することもできます。

    Task<StockDataCollection> loadFedHistoricalData =
        Task<StockDataCollection>.Factory.StartNew(
            () => LoadFedHistoricalData(),
            TaskCreationOptions.LongRunning);

    Task<StockDataCollection> normalizeHistoricalData =
        loadFedHistoricalData.ContinueWith(
            (t) => NormalizeData(t.Result));

このコードでは、loadFedHistoricalData タスクは、長時間実行される I/O バウンド タスクである LoadFedHistoricalData を実行します。これが戻ると、データを正規化する別のタスクを続行します。

ContinueWithは、継続タスクを常に実行するか、エラーやキャンセルなどの条件が満たされた場合にのみ実行するかを指定するために使用できる TaskContinuationOptions パラメーターを受け取ります。

第 5 章の A-Dash の例は、この種のイベンティングに対する別のアプローチを示しています。コードはhttp://parallelpatterns.codeplex.com/からダウンロードできます。AnalysisEngine クラスと MainWindowViewModel クラスを見てください。

于 2010-08-15T19:49:19.687 に答える
1

I/O パフォーマンスに関しては、非同期プログラミング モデル (APM) に勝るものはありません。いつでも使用できる場合は、使用する必要があります。幸いなことに、Task Parallel Library (TPL) には、APM の作業をFromAsync ファクトリ メソッドを介して「純粋な」TPL タスクと組み合わせるためのサポートが組み込まれています。

これら 2 つのプログラミング モデルを組み合わせて非同期の極楽を実現する方法の詳細については、MSDN の .NET SDK のこのセクション「TPL と従来の .NET 非同期プログラミング」を参照してください。

于 2010-09-12T14:36:26.460 に答える