如何在C#中保持线程活着

时间:2014-10-22 17:02:40

标签: c# .net multithreading

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

我有几个共享ConcurrentBag DeviceDeviceManager个对象的类。如果有关设备的参数在数据库中发生更改,DeviceManager类的任务是填充此集合并更新设备对象。因此,例如,在数据库中,某人更新设备23以具有50F的正常高。 DeviceManager将更新内存中的相应设备以获得此新值。

Oracle提供了一个事件处理程序,以便在表更改时通知(docs here)。我想附加一个事件处理程序,以便在内存中更新我的设备时收到通知。问题是,如何为我的{{1}}创建一个线程,让它在线程中空闲,直到事件发生并在那里处理?我希望事件触发并在此线程中处理,而不是主线程。

2 个答案:

答案 0 :(得分:1)

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

MSDN有一个我认为可以帮助您的示例:How to: Create and Terminate Threads

答案 1 :(得分:1)

.NET中有大量的同步技术,讨论整个范围的范围太宽,无法在此处解决。但是,您应该使用MonitorWait()方法查看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上的文档也有其他例子。

相关问题