0

正常にlock動作しているさまざまなスレッドから外部デバイスへの通信を同期するために、グローバル オブジェクトを使用しています。

コントロールを使用してslider値を設定し、それを外部デバイスに送信したいので、そのScrollイベントを使用して変更をリッスンしてからデバイスに送信します。

問題は、lock次のように、デバイスと通信する前にグローバル オブジェクトを使用する必要があることです。

private void slider_Scroll(object sender, EventArgs e)
{
    lock(lockObject)
    {
        //send slider values to external device
    }
}

を取得しようとすると、上記は常に無期限にハングアップしlockます。私のコードの残りの部分は正常に動作しているので、本物の競合状態があるとは思いません.UIスレッドで実行されているため、UIスレッドでブロックするのは悪い考えだと思います. 私は間違っているかもしれません。

ただし、この場合、上記のコードをメソッドにラップし、何らかの方法でUI スレッドから「メイン」スレッドで呼び出す必要があると思いますか?

どうすればこれを達成できますか?

4

1 に答える 1

1

lockメイン UI スレッドから使​​用することは絶対に良い考えではありません。フォームに BackgroundWorker() コントロールを追加し、スライダーの値を RunWorkerAsync() メソッドに渡します。経由で DoWork() ハンドラーの値を取得し、そこからe.Argument安全に使用できますlock

于 2013-10-30T15:06:04.927 に答える