1

このコードは約2時間実行されていました。その後、プログラムは応答を停止し、VSで一時停止して、実行中の行を確認しました。Parallelステートメントで停止し、「スレッドが参加してスリープを停止するのを待っている」ことについて何か言いました。

私のマルチスレッドの経験が少ないことは明らかなので、なぜこれが起こったのかわかりません。whileに入るスレッドは分離され、foreachで始まる他のすべてのスレッドを待つと思いました。

while (true)
        {
        Parallel.ForEach(servers, server => // It stopped here
        {

            Console.WriteLine(string.Format("Checking: {0} Thread: {1}", server.Hostname, Thread.CurrentThread.ManagedThreadId));
            try
            {
               // Do some network stuff
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message.ToString());
            }
        });
}

アップデート1

いくつかのネットワーク関連のものは、1500ミリ秒のタイムアウトでUDPの送受信を行っていますか。ここには、EntityFrameworkに基づくDBのものもいくつかあります。ですから、おそらくそれはうまくいかないことがたくさんあります。しかし、私はまだそれを引き起こすことができるものがわかりません。ソケット(UDPのものとDBのものの両方)が実行されていてタイムアウトを超えると、「処理」される例外が発生します

それで十分ではありませんか?スレッド全体に何らかのタイムアウトを設定できますか?5000ミリ秒間参加していない場合は、それを殺しますか?

4

2 に答える 2

3

私が最初に見たのは「ネットワーク関連の処理を行う」です(特に、無期限にブロックできる可能性はありますかRead。送信していないが閉じられていないストリームでタイムアウトが発生しない可能性があります)。「Dosomenetworkstuff」コードブロックのいずれかがブロックされた場合、すべてのアイテムが完了するまで元にParallel.ForEach戻らないため、全体がブロックされます。.ForEach

Parallel.ForEach結合の待機を見つけることは予想外でParallel.ForEach ありません(結局のところ、分割と結合です)-重要な質問は、他に何が起こっているか、つまり他のスレッドが何をしているのかということです。

pauseただし、誰かがキーボードを押すだけで(コンソール出力を一時停止する)、または誤ってコンソール領域をクリックしてドラッグした(コピー/貼り付けモードに入る可能性があり、コンソール出力を再び一時停止する)可能性があるかどうかも確認したいと思います。 )。

于 2012-08-15T06:07:40.827 に答える
1

これに数秒しかかからない場合は、を使用せずにコードを実行するParallel.ForEachと、すべてがメインスレッドにあるため、ブロックされているものを簡単に確認できます。

VS2010でこれを実行している場合は、VisualStudioの「並列スタック」デバッグウィンドウを使用して何が起こっているかを確認することもできます。ここを参照してください:http://msdn.microsoft.com/en-us/library/dd998398.aspx

マルチスレッドプログラミングの経験がない場合はThread、タスクパラレルでデバッグを開始する前に、シンプルで標準ベースのプログラムから始めて、デバッグツール(たとえば、スレッドのデバッグペインが必要になります)に慣れます。ライブラリ(Parallel.[...])。

于 2012-08-15T06:29:27.890 に答える