我正在開發一個Windows服務,它執行若干操作,包括偵聽多個不同端口上的傳入串行端口消息。如何在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)
//{
//}
}
沒有必要使用一個線程,當你有一個「DataReceived」事件。請不要使用該事件並調用常規阻止Read()或不要使用線程。並且觀察服務中對OnStart/OnStop的需求,您總是需要一個AutoResetEvent來檢測服務應該暫停還是停止。你可以調用它的WaitOne()方法來阻塞線程。 –
@Hans說什麼。您不必讓程序在服務的OnStart()方法中運行,事實上,您應該儘快從中返回。您的程序將繼續運行,直到服務停止。 – CodeCaster