いくつかのスレッドを実行していますが、エラーが検出されたら、メッセージボックスなどの対話を使用して実行を継続または停止します。また、画面に複数のメッセージボックスを表示したくないので、セマフォを追加して、1 つのスレッドだけで処理できるようにしました。しかし、うまくいきません。だから私は次のような状況にあります:
private void DO_WORK()
{
//some code missing
lock (_threadLock)
{
++activeWorkers;
}
ThreadPool.QueueUserWorkItem(o =>
{
WorkRequests(result);
lock (_threadLock)
{
--activeWorkers;
Monitor.Pulse(_threadLock);
}
});
lock (_threadLock)
{
if (STOP)
break;
while (activeWorkers > THREADS)
Monitor.Wait(_threadLock);
}
}
private void WorkRequests(string mystr)
{
string source = null;
string result = null;
bool processed = false;
bool messageBoxShown = false;
///////////////////////////////////
while(true)//this is for rechecking the bad ones
{
source = GetSource(mystr);
if (source == "ERROR_LIMITED")
{
lock (_threadLock)
{
if (!messageBoxShown)//<--- check messageBoxShown
{
if (MessageBox.Show("Blocked IP detected!\nPlease change it!", "test program", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
{
messageBoxShown = true; //<--- set to true
}
else
DoStop();
}
}
}
else
break;
}
result = mystr + " - " + source;
////////////////////////////////////////
}
メッセージボックスを表示し、ダイアログボックスに基づいて実行を継続または停止するスレッドを除くすべてのスレッドを一時停止するにはどうすればよいですか?