플러그인 기능을 갖춘 응용 프로그램을 작성했으며 플러그 인이 중지 요청에 신속하게 응답하지 않으면 작업자 스레드에서 Thread.Abort()
을 호출합니다 . 이것은 대부분의 경우 작동하는 것으로 보이지만 최근에 시리얼 포트에 쓰는 동안 쓰레드가 중단되면 ObjectDisposedException
을 던졌습니다. Windows XP에서 일부 USB 대 직렬 드라이버를 사용하면 파란 화면이 나타납니다.ObjectDisposedException 직렬 포트에 쓰는 스레드를 중단 할 때
나는 제작자/소비자 패턴을 사용하여 작업자 스레드가 직렬 포트에 직접 쓰지 않도록 할 수 있다고 생각하지만, 직렬 포트에 대한 더 자세한 정보가 있는지 알고 싶습니다. 괴물. 여기
문제 재현 간단한 예입니다 :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);
}
}
}
.Net은 어떤 버전입니까? USB를 직렬 어댑터에 사용할 때보고 된 버그가 있습니다. 가장 쉬운 테스트는 프로그램이 직렬 포트를 사용하는 동안 사용자의 것과 같은 프로그램을 가져 와서 어댑터를 가져 오는 것입니다. 이 문제는 4.0에서 수정되었습니다. 나는 Thread.Abort의 팬이 아니다. – dbasnett
안녕하세요, @ dbnet. .NET 3.5 SP1입니다. 나도 Thread.Abort의 팬이 아니지만 플러그가 정중 요청 (공유 부울)을 중지한다면 Thread.Abort를 사용한다. –
내가 언급 한 것처럼 다양한 버그가 Microsoft에보고되었습니다. connect.microsoft.com 참조 – dbasnett