我有一个Windows服务,旨在处理传入的数据,处理它,并在必要时提醒用户。我弄清楚的一件事就是如何让线程保持活力。
我有几个共享ConcurrentBag
Device
个DeviceManager
个对象的类。如果有关设备的参数在数据库中发生更改,DeviceManager
类的任务是填充此集合并更新设备对象。因此,例如,在数据库中,某人更新设备23以具有50F的正常高。 DeviceManager
将更新内存中的相应设备以获得此新值。
Oracle提供了一个事件处理程序,以便在表更改时通知(docs here)。我想附加一个事件处理程序,以便在内存中更新我的设备时收到通知。问题是,如何为我的{{1}}创建一个线程,让它在线程中空闲,直到事件发生并在那里处理?我希望事件触发并在此线程中处理,而不是主线程。
答案 0 :(得分:1)
您可以在服务启动时创建单独的工作线程。工作线程将连接到数据库并侦听更改通知,并相应地更新ConcurrentBag。关闭服务后,您可以正常终止该线程。
MSDN有一个我认为可以帮助您的示例:How to: Create and Terminate Threads
答案 1 :(得分:1)
.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+monitor+pulse+wait
当然,MSDN上的文档也有其他例子。