我正在构建一个多线程应用程序,我在应用程序启动时生成三个线程,这些线程继续运行应用程序生命周期。我的所有线程都是独占的,无论如何都不会相互干扰。现在用户可以暂停应用程序,在这里我想暂停或者说中止我的线程。
我目前正在将线程作为前台线程生成,但我想将它们更改为后台线程无论如何都不会影响我的应用程序(除了它们(前台线程)会使应用程序保持活动状态直到它们完成)。
我会请这里的人建议通过thread.suspend()或thread.abort()暂停应用程序的方法。我知道thread.suspend过时且有风险,但是对于我的应用程序也是有害的,我也没有使用任何类型的同步。
PS:我的线程正在保存并检索一些数据到&每分钟从嵌入式数据库(sqlite)。
答案 0 :(得分:2)
使用WaitHandles(ManualResetEvent,AutoResetEvent),Monitor,Semaphore等阻止机制......
安德鲁
P.S。这个问题相当广泛,所以我最终会建议阅读多线程的成熟实践和原则,其中包括同步。您的要求听起来并不太复杂,因此我相信您将能够研究出最适合您需求的方式。
答案 1 :(得分:1)
您可以创建一个互斥锁,让线程等待该互斥锁上的信号。这样你的线程就不会被破坏,但它们几乎不会消耗资源就会睡觉。
答案 2 :(得分:1)
我总是使用ManualResetEvent:
class Myclass
{
ManualResetEvent _event;
Thread _thread;
public void Start()
{
_thread = new Thread(WorkerThread);
_thread.IsBackground = true;
_thread.Start();
}
public void Stop()
{
_event.Set();
if (!_thread.Join(5000))
_thread.Abort();
}
private void WorkerThread()
{
while (true)
{
// wait 5 seconds, change to whatever you like
if (_event.WaitOne(5000))
break; // signalled to stop
//do something else here
}
}
}
答案 3 :(得分:0)
实际上,这种情况是唯一Thread.Suspend
有意义的情况。它被淘汰的原因是因为人们滥用它来伪造同步,或者在他们不拥有的线程上使用它(例如,ThreadPool线程)。