1

私は C# で作成されたマルチスレッド アプリケーションを持っています。私の最大スレッド数は 256 で、このアプリケーションは IP 間隔 (192.168.1.0 -192.168.205.255) でコンピューターのパフォーマンス カウンターを取得し、正常に動作し、1 日に何度も回転します。報告を受けなければならないからです。

しかし、問題は、1 つのマシンがスレッドを保持し、その作業を終了しないことがあるため、ループが回転しないことがあります...

カウントダウン パラメータを使用してスレッドを作成する方法はありますか。foreach でスレッドを開始するときは?

foreach(Thread t in threads)
{
   t.start(); -----> t.start(countdownParameter) etc....
}

countdown パラメータは、各スレッドの最大寿命です。これは、スレッドがマシンに到達できない場合、スレッドを中止する必要があることを意味します。たとえば、60秒..いいえ、256台のマシンではなく、256個のスレッドを意味していました...約5000個のIPがあり、そのうち600個が稼働しています。すっごく私は256のスレッドを使ってそれらの値を読んでいます。もう1つはループです。私のループは、すべてのipiesが終了している間、最初から開始するように機能しています。

4

4 に答える 4

0

通常、スレッドはブロッキング呼び出しでスタックします (もちろん、無限ループを引き起こすバグがない限り)。どの通話がブロックされているかを特定し、それを「突く」ことでブロックを解除する必要があります。スレッドが .NET BCL 待機呼び出し (WaitHandle.WaitOneなど) の 1 つの内部で待機している可能性があります。その場合はThread.Interrupt、ブロックを解除するために使用できます。ただし、あなたの場合、リモート コンピューターとの通信を管理する API がハングしている可能性が高くなります。場合によっては、別のスレッドから接続を閉じるだけで、ハングしたメソッドのブロックが解除されることがあります (Socketクラスの場合と同様)。他のすべてが失敗した場合は、最後の呼び出しのメソッドにフォールバックする必要があるかもしれませんThread.Abort。スレッドを中止するとアボートが発生したアプリ ドメインの状態、またはプロセス全体さえも破損します。.NET 2.0 には、アボートを以前よりもはるかに安全にする多くの規定が追加されましたが、それでもリスクはあります。

于 2010-10-19T12:52:05.707 に答える
0

スレッド実行のタイムアウトを指定することはできません。ただし、Joinタイムアウトを使用して各スレッドを試行し、終了しない場合は中止することができます。

foreach(Thread t in threads)
{
   t.Start();
}

TimeSpan timeOut = TimeSpan.FromSeconds(10);
foreach(Thread t in threads)
{
   if (!t.Join(timeOut))
   {
       // Still not complete after 10 seconds, abort
       t.Abort();
   }
}

WaitHandleもちろん、メソッドで s を使用するなど、より洗練された方法があります(ほとんどの実装では一度に 64 個のハンドルに制限されており、UI スレッドなどの STA スレッドでは機能しないことにWaitAll注意してください)。WaitAll

于 2010-10-18T23:16:24.607 に答える
0

外部からスレッドを終了しないでください。(スレッドを強制終了しないでください。自殺させてください)。注意を怠ると、スレッドを強制終了すると、アプリドメインの状態が簡単に破損する可能性があります。

制限時間に達するとタイムアウトするか、非同期ネットワーク コードを使用するように、スレッド内のネットワーク コードを書き直す必要があります。

于 2010-10-19T07:35:14.703 に答える
-1

次のようにsmthを使用できます。

public static T Exec<T>(Func<t> F, int Timeout, out bool Completed)
{
    T result = default(T);
    Thread thread = new Thread(() => result = F());
    thread.Start();
    Completed = thread.Join(Timeout);
    if(!Completed) thread.Abort();
    return result;
}
于 2010-10-19T08:20:17.933 に答える