1

そこにハロー、

私は VS 2010 を使用しており、winform クライアント アプリと wcf サービスを使用しています。クライアントから wcf サービスを呼び出します。コールバック機能を実装し、netnamedpipe バインディングを使用しました。サービスメソッドを呼び出しました。このメソッドは内部に UserAccount オブジェクトのリストを持っています。このメソッドは、各 UserAccount オブジェクトを繰り返し処理し、長時間実行されるプロセスを呼び出します。各プロセスの最後に、イベント [callback] を発生させ、プロセスのステータスを通知します。UserAccount オブジェクトの各プロセスに対して、バックグラウンド ワーカーを使用して実行する予定です。しかし、Rx リアクティブ フレームワークには、この要件を満たすより信頼できる機能があります。この場合、 RX を使用して並列実行は可能ですか? wcf サービス呼び出しを呼び出すだけです。

1. Client ---> Wcf ----> wcf.DoLongRunning() ---> 
2. foreach (UserAccount usr in UserAccountLists)  // Is there anyway to avoid looping
   { 
       class A = new class(); 
       call A.Method1(usr) and A.Method2(usr) // call these 2 methods parallel.
       // these 2 methods have return values. how to handle that one also in Rx ???
   }   

これは、並列実行内の並列実行のようです。

Rx または任意のスレッド モデルを使用して、この機能の適切なアプローチを提案できますか。各オブジェクトの処理には、さらに時間がかかります。並列実行を行う方法はありますか??

4

1 に答える 1

1

使ってみましたParallel.Foreachか?

Parallel.ForEach<UserAccount>(UserAccountLists, usr =>
{
    classA A = new classA(); 
    A.Method1(usr);
    A.Method2(usr);
});

コードを使用Parallel.Foreachすると、続行する前にすべての操作が完了するのを待ちます。

別の方法は、foreachをそのままにして、メソッド呼び出しを使用するように変更することTaskです。

Task t1 = new Task(() => A.Method1(usr));
t1.Start();

Task t2 = new Task(() => A.Method2(usr));
t2.Start();

このようにして、すべての操作が完了する前にメソッドが戻ります。だから私はそれがあなたが望むものに依存すると思います。このTask例では、2つのメソッドが互いに独立して実行されることに注意してください。あなたの場合、それで問題ないかどうかはわかりません。

編集:タスクに結果タイプがある場合、タスクの結果にアクセスできます。結果タイプは、タスクに汎用パラメーターを指定することで指定できます 。Task<string>結果は。になりstringます。

数千のタスクについて:単純に数千のタスクオブジェクトを作成するのは賢明ではないと思います。ただし、カスタムTaskSchedulerのさまざまな実装を検索することはできます。これにより、「多くの」タスクの作成と実行をより細かく制御できるようになります。

于 2013-01-30T14:16:53.803 に答える