C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 24 を表示中)
■10984 / )  RS232でのシリアル通信終了時について
□投稿者/ あら (40回)-(2007/12/03(Mon) 18:16:24)

分類:[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)
                { }
            }
        }
    }

返信 編集キー/


管理者用

- Child Tree -