如何在C#中保持线程的活力

本文关键字:线程 | 更新日期: 2023-09-27 18:27:25

我有一个windows服务,旨在处理传入数据,处理数据,并在必要时提醒用户。有一件事我很难弄清楚,那就是如何保持线程的活力。

我有几个类共享Device对象的ConcurrentBagDeviceManager类的任务是填充此集合,并在数据库中有关设备的参数发生更改时更新设备对象。因此,例如,在数据库中,有人将设备23更新为具有50F的正常高。DeviceManager将更新存储器中的适当设备以具有该新值。

Oracle提供了一个事件处理程序,以便在表发生更改时得到通知(此处为文档)。我想附加一个事件处理程序,以便通知我何时更新内存中的设备。问题是,我如何创建一个线程,让我的DeviceManager在其中工作,并让它在线程中空闲,直到事件发生并在那里处理?我希望事件被激发,并在这个线程中处理,而不是在主线程中处理。

如何在C#中保持线程的活力

您可以在服务启动时创建一个单独的工作线程。工作线程将连接到数据库并侦听更改通知,并相应地更新ConcurrentBag。当服务关闭时,您可以正常地终止线程。

MSDN有一个我认为会对您有所帮助的示例:如何:创建和终止线程

.NET中有大量的同步技术,讨论整个范围太广,无法在这里解决。但是,您应该查看Monitor类及其Wait()Pulse()方法。

例如:

private readonly object _lockObj = new object();
public void StartThread()
{
    new Thread(ThreadProc).Start();
}
public void SignalThread()
{
    lock (_lockObj)
    {
        // Initialize some data that the thread will use here...
        // Then signal the thread
        Monitor.Pulse(_lockObj);
    }
}
private void ThreadProc()
{
    lock (_lockObj)
    {
        // Wait for the signal
        Monitor.Wait(_lockObj);
        // Here, use data initialized by the other thread
    }
}

当然,如果需要线程重复操作,可以将线程的锁定/等待代码放入循环中。

SO上的Monitor类似乎不乏其他问题:https://stackoverflow.com/search?q=%5Bc%23%5D+监视器+脉冲+等待

当然,MSDN上的文档也有其他示例。