我遇到了一個有趣的問題,在我的C#.Net 4.0應用程序中使用SerialPort
類和ThreadPool.QueueUserWorkItem
或Task
s。.Net線程與線程池vs任務串口通信
如果我同時使用2個或多個串行端口,則只會出現此問題。每個串口在自己的線程中運行,我創建1 3的方式:
new Thread(DoSerialCommX)
ThreadPool.QueueUserWorkItem(DoSerialCommX)
new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()
爲了說明這個問題,我創建了DoSerialCommX
方法來讀取並永遠在一個循環中寫入串行端口。它看起來像這樣:(我實際上並沒有在我的真實程序中這樣做,這只是我測試程序中的一個片段,它隔離並說明了問題)。
private void DoSerialCommX()
{
SerialPort port = new SerialPort("ComX", 9600);
port.Open();
while(true)
{
//Read and write to serial port
}
}
如果我使用方法2或3,串行通信口吃和我收到很多通信超時。如果我使用方法1,一切都很好。另外,我應該提到這似乎只發生在我的基於Intel Atom的個人電腦上。臺式電腦似乎沒有問題。
我知道線程池重用線程,並且默認Task
使用線程池。而且我知道線程池真的用於短期操作。但我嘗試使用,我認爲它會產生一個專用線程而不是使用線程池,但它仍然無法工作。
那麼問題:是什麼讓Thread
在這種情況下如此特別?是否有關於Thread
的更多信息使其更適合IO操作?
編輯: 答案迄今似乎認爲我試圖使用線程池或任務的一個永無止境的過程。在我的真實應用中,情況並非如此。我只是在上面的代碼中使用了一個永無止境的循環來說明問題。我真的需要知道爲什麼Thread
工作和ThreadPool
和Task
不。他們在技術上有什麼不同,會導致串行通信打嗝?
我想這是一個愚蠢的問題,但你並沒有試圖管理> = 25線程,是嗎? – Jeff 2012-04-12 04:49:55
@ JeffN825,不,每個串口只有1個線程,而且我最多使用4個串口。 – Verax 2012-04-12 06:16:11
1和3是一樣的。 – 2012-04-12 08:35:17