如何在 Windows 服务中保持线程打开

How to keep thread open in Windows service

我正在开发一个 Windows 服务,它可以做几件事,包括在几个不同的端口侦听传入的串行端口消息。

通过为每个串行设备打开一个线程来进行监听。

我仍然想知道如何在收听的同时保持线程畅通。 我尝试了 while(true){} 循环之类的东西,它可以工作,但是当连接多个设备时 cpu 达到 100%。

在控制台应用程序中,我可以使用 console.readline(),我正在寻找类似且简单的东西。

这就是我现在拥有的,我怎样才能让它发挥作用?

    public static void Start()
    {
        var devices = MyService.Kernel.Get<IDevicesService>();
        foreach (var device in devices.ComDevices.List())
        {
            var thread = new Thread(() => StartKeypadThread(device.Id));
            thread.Start();
        }
    }

    public static void StartKeypadThread(int deviceId)
    {
        var devices = MyService.Kernel.Get<IDevicesService>();
        var device = devices.ComDevices.Find(deviceId);
        var c = new SerialConnector(device);
        c.SerialDataRecieved += c_SerialDataRecieved;
        c.Start();
        //Console.ReadLine(); --> I know, sounds stupid, it's a Service :)
        //while (true)
        //{
        //}
    }

字面回答:Thread.Sleep(Timeout.Infinite).

为什么你需要 "hang" 线程,尤其是永远?也许您应该使用在您希望服务停止时发出信号的 ManualResetEvent。

此外,不需要启动所有这些子线程来仅附加事件。每个都将 运行 持续 1 毫秒左右,然后退出。浪费时间。

谢谢大家的帮助。 我在线程方面没有经验,所以也许我确实不需要使用这些线程,但是当我不需要时,我在服务的另一部分(我没有使用的地方)收到错误 "Safe Handle Has been Closed"这些 Com 设备)。

为了快速解决问题并继续使用这些线程,我找到了使用 WaitHandler 的另一种解决方案。

如果有人需要它,我是这样做的:

public static void Start()
{
    var devices = MyService.Kernel.Get<IDevicesService>();
    foreach (var device in devices.ComDevices.List())
    {
        var thread = new Thread(() => StartKeypadThread(device.Id));
        thread.Start();
    }
}

public static void StartKeypadThread(int deviceId)
{
    var devices = MyService.Kernel.Get<IDevicesService>();
    var device = devices.ComDevices.Find(deviceId);
    var c = new SerialConnector(device);
    c.SerialDataRecieved += c_SerialDataRecieved;
    c.Start();
    var waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, Guid.NewGuid().ToString());
    waitHandle.WaitOne();
}