2010-07-12 25 views
0

我构建了一个多线程应用程序,其中应用程序启动时产生了三个线程,并且这些线程继续运行以实现应用程序生命周期。我的所有线程都是排他性的,不管怎样都不会互相干扰。现在用户可以暂停应用程序,并且在这里我想暂停或者说,放弃我的线程。我正在将线程产生为前台线程,但我猜想将它们改为后台线程不会影响我的应用程序(除非它们(前台线程)会使应用程序保持活动状态直到它们完成)。为多线程应用程序建议一种改进的方法

我会问这里的人建议通过thread.suspend()或thread.abort()暂停应用程序的方法。我知道thread.suspend已经过时并且有风险,但是它对我的应用程序也有害,因为我没有使用任何类型的同步。 PS:我的线程每分钟都会从嵌入式数据库(sqlite)保存和检索一些数据到&。

回答

1

您可以创建一个互斥锁,让线程等待该互斥锁的信号。这样你的线程就不会被销毁,但是他们几乎不会消耗资源。

Mutex.WaitOne

+0

在应用程序中,我的线程大部分时间都在睡觉,然后醒来后执行他们的工作,然后再次入睡。此过程将持续到申请暂时暂停或永久注销为止。但是,我希望线程在用户暂停或注销应用程序后立即退出。你认为这可以通过互斥或等待手柄来实现吗?如果是这样,请您详细说明一下(只是一个简单的要求),因为我刚开始使用这个多线程的东西。谢谢。 – madcap 2010-07-12 12:31:58

+0

不,这是不可能的,但你真的需要_destroy_线程,或者你只是想停止线程处理?答案应该主要取决于线程需要的资源(即将大对象保留在内存中) – dbemerlin 2010-07-12 12:46:59

+0

嗯,我希望我的线程在用户暂停时暂时挂起,然后当用户恢复时,我希望我的线程再次运行。用户也可以注销我想中止所有线程的应用程序。我现在所做的是我在两种情况下中止了线程。 – madcap 2010-07-12 13:01:45

2

使用封锁机制,例如WaitHandles(ManualResetEvent的,的AutoResetEvent),监视器,旗语等..

安德鲁

附:这个问题相当广泛,所以我最终会推荐阅读经过验证的实践和多线程原理,其中包括同步。您的要求听起来不太复杂,所以我相信您将能够研究适合您需求的最佳方式。

+0

可以等待句柄来立即暂停或中止线程?此外,我不明白,如果因为没有使用任何关键区域或同步化而立即中止我的线程,可能会出现什么问题。 – madcap 2010-07-12 12:34:00

0

其实,这种情况是唯一一所在Thread.Suspend确实才有意义。它被废弃的原因是因为人们滥用它来伪造同步,或者在他们不拥有的线程上使用它(例如,ThreadPool线程)。

+0

我感觉一样。干杯! – madcap 2010-07-12 12:35:05

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 
     } 
    } 
}