如何在C#中保持线程的活力
本文关键字:线程 | 更新日期: 2023-09-27 18:27:25
我有一个windows服务,旨在处理传入数据,处理数据,并在必要时提醒用户。有一件事我很难弄清楚,那就是如何保持线程的活力。
我有几个类共享Device
对象的ConcurrentBag
。DeviceManager
类的任务是填充此集合,并在数据库中有关设备的参数发生更改时更新设备对象。因此,例如,在数据库中,有人将设备23更新为具有50F的正常高。DeviceManager
将更新存储器中的适当设备以具有该新值。
Oracle提供了一个事件处理程序,以便在表发生更改时得到通知(此处为文档)。我想附加一个事件处理程序,以便通知我何时更新内存中的设备。问题是,我如何创建一个线程,让我的DeviceManager
在其中工作,并让它在线程中空闲,直到事件发生并在那里处理?我希望事件被激发,并在这个线程中处理,而不是在主线程中处理。
您可以在服务启动时创建一个单独的工作线程。工作线程将连接到数据库并侦听更改通知,并相应地更新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上的文档也有其他示例。