1

ケース 1: コンソール テスト アプリとライブラリがあります。テスト アプリは、並列で実行することを意図したライブラリ内のクラスで非同期メソッドを呼び出します。サンプルコード

        for (int i = 0; i < 100; i++)
        {
            var myTask = RetrieveRecordSet<TestClass3>();
        }

これは、コンソール アプリで期待どおりに機能します。つまり、100 個のタスクすべてが同時にキューに入れられ、タスクがバックグラウンドで並行して実行され、コンソール出力によって証明されます。

ケース 2: コンソール アプリではなく、WPF アプリで同じコードを使用する。何らかの理由で、タスクが順番に実行されます。

ケース 3: WPF アプリに次の変更を加えてみましたが、役に立ちませんでした。

        for (int i = 0; i < 100; i++)
        {
            var myTask = Task.Factory.StartNew(() => RetrieveRecordSet<TestClass3>());
        }

ケース 4: 次に、次のことを試しましたが、UI がブロックされ、まだシーケンシャルです

        Parallel.For(0, 100, a => RetrieveRecordSet<TestClass3>());

WPF アプリでケース 1 から取得したのと同じノンブロッキングの並列動作を取得する方法はありますか?

4

3 に答える 3

0

回答ありがとうございます。結局、答えはもっと悪質で、何が問題なのかはまだわかりませんが、回避策を見つけました。基になるコードは、WCF サービス呼び出しを行っています。Task Parallel ライブラリを使用して、チャネルが初めて使用されるときに一連の並列 WCF 呼び出しを行うと、それらの呼び出しがシリアル化されます。最初に単一の呼び出しでチャネルを「準備」し、応答を待ってから、多数の並列 WCF 呼び出しでそれをスラムすると、完全な並列処理が得られることを思いがけなく発見しました。WCF チャネルをそのように準備する適切な方法はありますか? これは WCF または TPL のバグですか?

于 2013-03-25T22:46:44.367 に答える
0

Parallel.For は確かにブロッキング操作です。Parallel.For ループを UI とは別のスレッドで実行する場合:

new Thread(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();

または

new Task(() => Parallel.For(0, 100, index => RetrieveRecordSet<TestClass3>())).Start();
于 2013-03-25T02:57:21.667 に答える
0

次のことを試してください。

Await Task.Run(() => 
{
    Parallel.For(0,100, ()=> RetrieveRecordSet<>());
}
于 2013-03-21T22:33:59.000 に答える