Я написал приложение с функцией плагина, и если плагин не отвечает быстро на запрос на остановку, я вызываю Thread.Abort()
в его рабочем потоке. Кажется, это работает большую часть времени, но недавно я обнаружил, что он выдает ObjectDisposedException
, если поток прерывается во время записи в последовательный порт. С некоторыми драйверами USB-to-serial в Windows XP это даже вызывает синий экран смерти.
Я думаю, что могу использовать шаблон «производитель / потребитель», чтобы сделать так, чтобы рабочий поток не выполнял прямую запись в последовательный порт, но я хотел бы знать, есть ли какая-либо дополнительная информация о том, почему сбои последовательного порта вне.
Вот упрощенный пример, который воспроизводит проблему:
using System;
using System.IO.Ports;
using System.Threading;
class Program
{
private static SerialPort port = new SerialPort();
static void Main(string[] args)
{
port.PortName = "COM1";
port.Open();
for (int i = 0; i < 10; i++)
{
var workerThread = new Thread(Loop);
workerThread.Start();
Thread.Sleep(1000);
workerThread.Abort();
Thread.Sleep(1000);
Console.Out.WriteLine("Finished {0}.", i);
}
}
static void Loop()
{
for (int i = 0; i < 1000000; i++)
{
port.Write(new byte[] {0, 0, 0, 0, 0, (byte)(i % 256)}, 0, 6);
}
}
}