1

シリアル デバイスからデータを取得し、このプロトコルを処理できる特定のプログラムがアクセスできるサーバーにデータを配置するプログラムがあります。このサーバーは、アクティブ x コントロールの形をしたサードパーティ プログラムです。

残念なことに、ハードウェア デバイスには Thread.Sleep が必要です。サーバーを監視するプログラムは、スレッドがスリープしている間にサーバーにクエリを実行することがあります。これにより、サーバーに障害が発生したと見なされます。

私の次のアイデアは、サーバー タスク専用の別のスレッドにサーバーを配置することでした。UI スレッドで、次のコードを実行します。

        Thread workerThread = new Thread(DoServerWork);
        workerThread.SetApartmentState(ApartmentState.STA);
        workerThread.Start();

デリゲートでは、私は持っています

    public void DoServerWork()
    {
        rtu = new AxASMBSLVLib.AxASMBSLV();
        rtu.CreateControl();
        rtu.BeginInit();
        rtu.OpenPort();

        while (true)
        {

        }
    }

問題は、サーバーが動作を開始してから約 5 秒で応答しなくなることです。私の最初の考えは、スレッドが終了していることですが、 while(true) はそれが起こらないようにする必要があります。何かご意見は?

4

2 に答える 2

2

これをシングル スレッド アパートメント (STA) で実行しているため、そのスレッドが空の無限ループに到達すると、それ以上何も起こりません。一般に、無限ループはお勧めできません。OnElapsed イベント ハンドラーでサーバーの作業を定期的に実行するには、おそらくタイマーを使用する必要があります。

于 2012-09-22T21:02:43.373 に答える
0

サードパーティ製の modbus TCP/IP スレーブです。最初のオプションは、ツールボックスから GUI に「ドラッグ アンド ドロップ」して、UI スレッドに配置することです。

ActiveX には STA が必要なので、まさに正しいことです。

UI スレッドで Thread.Sleep を呼び出す必要があります。

それは決して必要ではありません。ここにあなたの本当の問題があります。メインスレッドをブロック/スリープしないでください。

あなたの質問は、Sleep() を回避する方法に関するものです。

于 2012-09-23T10:27:03.230 に答える