我在 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 等待并在正确的时间触发任务,另一个执行任务:
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
不会起作用,因为不同机器上经过的时间变化太大。