このコードは約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ミリ秒間参加していない場合は、それを殺しますか?