Windows フォーム C# アプリケーションのマルチスレッド アプリで問題が発生しています。このアプリケーションはマルチコア マシンでは正常に動作しますが、シングル コア マシンで実行するとすべてのスレッドがハングします。私が使用しているbackgroundWorker
、コードは次のとおりです。
class custonTime // delay class
{
public void sleep_sec(int sleep)
{
int time_now = Environment.TickCount;
int time_sleep = sleep;
while ((Environment.TickCount - time_now) < time_sleep) ;
}
}
UI のボタンを押すと、フラグaction
がdoAlways
設定されtrue
、次のバックグラウンドワーカーが開始されます。backgorundworker1 は待機し、適切なタイミングでタスクを開始します。もう 1 つはタスクを実行します。
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
while(action)
{
if(doItAlways)
{
//do important tasks
}
if(task1)
{
//do things
task1 = false;
}
if(task2)
{
//do things
task1 = false;
}
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
task1=true;
manegerTimewr2.sleep_sec(12000);//call delay class to wait 12 secs
task2=true;
manegerTimewr2.sleep_sec(12000);//call delay class to wait 12 secs
}
私の遅延クラスは私だけでbackgorundworker1
なくbackgroundworker2
、 flag によって起動されたタスクを実行することを不可能にしますdoItAlways
。アプリケーションは while ループが終了したときにのみ解放されます。
そして、それはシングルコアマシンでのみ発生します。
別の方法はありますか?他のスレッドをブロックすることなく、しばらく時間が経過するまでスレッドをハングアップする直接的で簡単な方法は?
Thread.Sleep
経過時間はマシンによって大きく異なるため、メモは機能しません。