我在 C# .Net 4.0 应用程序中遇到了一个有趣SerialPort
的ThreadPool.QueueUserWorkItem
问题Task
。
仅当我同时使用 2 个或更多 SerialPorts 时才会出现此问题。每个串行端口在我以 3 种方式中的 1 种方式创建的自己的线程中运行:
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 的 PC 上。台式电脑似乎没有问题。
我知道线程池重用线程,并且默认Task
使用线程池。而且我知道线程池确实适用于短期操作。但是我尝试使用TaskCreationOptions.LongRunning
,我认为它会产生一个专用线程而不是使用线程池,但它仍然不起作用。
所以问题是:在这种情况下有 什么Thread
特别之处?有什么东西Thread
使它更适合 IO 操作吗?
编辑:
到目前为止的答案似乎假设我正在尝试将 ThreadPool 或 Tasks 用于永无止境的过程。在我的实际应用中,情况并非如此。我只是在上面的代码中使用了一个永无止境的循环来说明问题。我真的需要知道为什么Thread
有效和ThreadPool
无效Task
。它们在技术上有何不同会导致串行通信中断?