现在,我的功能运作良好。
StartWorking() {
mThread = new Thread(fooFunction);
mMonitorThread = new Thread(MonitoringThreadFunction);
mThread.Start();
mMonitorintThread.Start();
}
现在,我需要为此代码添加一个loog。让它连续运行几次。顺序。 我试过这样做。但它搞砸了。线程的工作不正常。
StartWorking()
{
for(int i = 0; i < 3; i++)
{
mThread = new Thread(fooFunction);
mMonitorThread = new Thread(MonitoringThreadFunction);
mThread.Start();
mMonitorintThread.Start();
}
}
那么,我该怎样做才能为我的目的做什么?
答案 0 :(得分:3)
让它连续运行几次。顺序。
如果您尝试按顺序运行代码,则线程可能不合适。至少,您需要启动两个工作线程,然后等待它们完成。
这可以通过添加对Join()
的调用,在您的代码中完成,即:
StartWorking()
{
for(int i = 0; i < 3; i++)
{
mThread = new Thread(fooFunction);
mMonitorThread = new Thread(MonitoringThreadFunction);
mThread.Start();
mMonitorintThread.Start();
// Wait for these to finish before starting another loop
mThread.Join();
mMonitorintThread.Join();
}
}
但是,我建议考虑将其切换为使用TPL。语法更清晰,IMO:
StartWorking()
{
for(int i = 0; i < 3; i++)
{
Parallel.Invoke(
() => fooFunction(),
() => MonitoringThreadFunction()
);
}
}
此外,这将利用ThreadPool而不是每次都启动一个新线程,这可能会更有效。 (它也可能会重用当前的线程,而不是让它阻塞......)
答案 1 :(得分:0)
尝试
mThread.Join();
mMonitorThread.Join();
或者,如果您使用.NET≥4,请使用System.Threading.CountdownEvent
和InitialCount = 2并将其传递给Thread.Start()
方法。
编辑:然而,TPL解决方案绝对更清晰。