.Net Thread, ThreadPool и Task для связи SerialPort

Я столкнулся с интересной проблемой в своем приложении C# .Net 4.0, используя класс SerialPortи либо ThreadPool.QueueUserWorkItem или Заданиес.

Проблема возникает только при одновременном использовании 2 или более последовательных портов. Каждый последовательный порт работает в своем собственном потоке, который я создаю одним из трех способов:

  1. новый поток (DoSerialCommX)
  2. ThreadPool.QueueUserWorkItem (DoSerialCommX)
  3. новый 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не работают. Что в них технически отличается, что может вызвать сбои в последовательной связи?

5
задан Verax 12 April 2012 в 06:33
поделиться