0

デバイスとインターフェイスしているので、シリアルポートで読み取ることができるバイトがあるかどうかを常に確認する方法が必要です。使用できる場合は、それらを読み取ってさまざまな機能を実行する必要があります。作業中のプロジェクトが原因で、さまざまな理由でdata_receivedイベントを作成できません。現在、新しいスレッドで無限ループを実行していますが、コンピューターの速度が低下しています。

他に何かアイデアはありますか?どんな助けでも大歓迎です。以下は私が現在使用しているforループコードです。

void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        object[] parameters = (object[])e.Argument;
        SerialPort port = (SerialPort)parameters[0];
        agentRadio agentR = (agentRadio)parameters[1];

        for (; ; )
        {
            if (port.IsOpen)
            {
                try
                {
                    if (port.BytesToRead > 0)
                    {
                        byte value = (byte)port.ReadByte();

                        if (value == Global.OFF_CHAR)
                        {
                            port.Close();
                            Global.isConnected = false;
                            Form form = new Form();
                            form.deviceDisconnect(agentR);

                            MessageBox.Show("Your device has disconnected on its own, due to inactivity or because a key was switched off.", "Device Disconnect", MessageBoxButton.OK, MessageBoxImage.Information);

                            break;
                        }
                        else if (value == Global.WARNING_CHAR[0])
                        {
                            if (Global.activeClick)
                            {
                                port.BaseStream.Write(Global.POLL_CHAR, 0, Global.POLL_CHAR.Length);
                            }
                        }
                    }
                }
                catch {  }
            }
            else
            {
                break;
            }
        }
    }
4

2 に答える 2

2

恐ろしい 'if (port.BytesToRead > 0)' ポーリング ループを取り除きます。なぜそうするのですか - チェックが false を返した場合、他に何もしないので、通常の方法で読み取りをブロックさせてください。

于 2012-08-06T17:01:12.407 に答える
0

DataReceivedイベントをご利用ください。このイベントはセカンダリ スレッドで呼び出されます。別のスレッドやイベントを作成する必要はありませんBackgroundWorker

于 2012-08-07T02:55:12.980 に答える