为多线程应用程序建议一种改进的方法

时间:2010-07-12 12:13:51

标签: c# asp.net multithreading

我正在构建一个多线程应用程序,我在应用程序启动时生成三个线程,这些线程继续运行应用程序生命周期。我的所有线程都是独占的,无论如何都不会相互干扰。现在用户可以暂停应用程序,在这里我想暂停或者说中止我的线程。

我目前正在将线程作为前台线程生成,但我想将它们更改为后台线程无论如何都不会影响我的应用程序(除了它们(前台线程)会使应用程序保持活动状态直到它们完成)。

我会请这里的人建议通过thread.suspend()或thread.abort()暂停应用程序的方法。我知道thread.suspend过时且有风险,但是对于我的应用程序也是有害的,我也没有使用任何类型的同步。

PS:我的线程正在保存并检索一些数据到&每分钟从嵌入式数据库(sqlite)。

4 个答案:

答案 0 :(得分:2)

使用WaitHandles(ManualResetEvent,AutoResetEvent),Monitor,Semaphore等阻止机制......

安德鲁

P.S。这个问题相当广泛,所以我最终会建议阅读多线程的成熟实践和原则,其中包括同步。您的要求听起来并不太复杂,因此我相信您将能够研究出最适合您需求的方式。

答案 1 :(得分:1)

您可以创建一个互斥锁,让线程等待该互斥锁上的信号。这样你的线程就不会被破坏,但它们几乎不会消耗资源就会睡觉。

Mutex.WaitOne

答案 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线程)。