Я столкнулся с интересной проблемой в своем приложении C# .Net 4.0, используя класс SerialPort
и либо ThreadPool.QueueUserWorkItem
или Задание
с.
Проблема возникает только при одновременном использовании 2 или более последовательных портов. Каждый последовательный порт работает в своем собственном потоке, который я создаю одним из трех способов:
новый поток (DoSerialCommX)
ThreadPool.QueueUserWorkItem (DoSerialCommX)
новый 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
использует пул потоков. И я знаю, что пул потоков действительно предназначен для кратковременных операций. Но я попытался использовать TaskCreationOptions.LongRunning
, который, как я думал, порождает выделенный поток, а не использует пул потоков, но он все еще не работает.
Итак, Вопрос:Что делает Thread
таким особенным в этой ситуации? Есть ли что-то в Thread
, что делает его более подходящим для операций ввода-вывода?
Изменить:
Ответы до сих пор предполагают, что я пытаюсь использовать ThreadPool или Tasks для бесконечного процесса. В моем реальном приложении это не так. Я использую бесконечный цикл в приведенном выше коде только для иллюстрации проблемы. Мне действительно нужно знать, почему Thread
работает, а ThreadPool
и Task
не работают. Что в них технически отличается, что может вызвать сбои в последовательной связи?