|
分類:[C#]
お世話になっております。
シリアル通信の終了処理について質問があります。
デバッグモードで起動し終了すると、40~50回に1度終了時に【エラー内容】の例外が発生します。
どのように記述すれば回避できるのでしょうか?
ご教授、アドバイス等宜しくお願いします。
C# .NET2005
【エラー内容】
System.ObjectDisposedException はハンドルされませんでした。
Message="セーフ ハンドルは閉じられています。"
Source="System"
ObjectName=""
StackTrace:
場所 Microsoft.Win32.UnsafeNativeMethods.SetCommMask(SafeFileHandle hFile, Int32 dwEvtMask)
場所 System.IO.Ports.SerialStream.Dispose(Boolean disposing)
場所 System.IO.Ports.SerialStream.Finalize()
----
【ソース】
[Form1.cs]
private Thread TestThred;
private void Form1_Load(object sender, EventArgs e)
{
PollingThrd polling = new PollingThrd();
TestThred = new System.Threading.Thread(new ThreadStart(polling.StartPolling));
TestThred.IsBackground = true;
TestThred.Start();
}
[PollingThrd.cs]
public class PollingThrd
{
public void StartPolling()
{
int wait_time = 1000;
TestSerialPort serialTest = new TestSerialPort();
AutoResetEvent autoEvent = new AutoResetEvent(false);
StatusChecker statusChecker = new StatusChecker();
TimerCallback timerDelegate = new TimerCallback(statusChecker.CheckStatus);
using (System.Threading.Timer stateTimer = new System.Threading.Timer(timerDelegate, autoEvent, wait_time, wait_time))
{
while (true)
{
autoEvent.WaitOne();
serialTest.Start();
}
}
}
}
public class StatusChecker : IDisposable
{
public StatusChecker()
{ }
public void CheckStatus(Object stateInfo)
{
AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
autoEvent.Set();
}
public void Dispose()
{ }
}
[TestSerialPort.cs]
public class TestSerialPort
{
string portName = "COM1";
public TestSerialPort()
{ }
public void Start()
{
using (System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort())
{
//設定
serialPort.PortName = portName;
serialPort.ReadTimeout = 500;
try
{
serialPort.Open();
}
catch (System.IO.IOException ee)
{
return;
}
//てすと
serialPort.Write("ABC");
try
{
string s = serialPort.ReadLine();
}
catch (TimeoutException)
{ }
}
}
}
|