如何在 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();
}
我正在开发一个 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();
}