0

スレッド同期の問題に直面しました。私のプレゼンターはいくつかのセンサーを分析し、UI フォームを更新します。更新コードを別のスレッドに移動しました。正常に動作しますが、ビューの更新中にユーザーがプレゼンターを停止すると、ソフトウェアがフリーズします - view.UpdateUI が動作しているときに発生することがわかりました (Invoke を使用していくつかのラベルを設定するだけです)。私の問題はどこですか?Compact Framework 3.5 と Windows CE 5 を使用しています

using System.Threading;

class MyPresenter
{
  UserControl view;

  private Thread thread;
  private ManualResetEvent cancelEvent;

  public void Start()
  {
    cancelEvent = new ManualResetEvent(false);
    thread = new Thread(UpdateView) { IsBackground = true };
    thread.Start();
  }

  public void Stop()
  {
    if (thread != null) {
      cancelEvent.Set();
      thread.Join();
      thread = null;
    }
  }

  private void UpdateView()
  {
    while (cancelEvent.WaitOne(1000, false) == false) {
      // analyze something
      view.UpdateUI(...);
    }
  }
}
4

2 に答える 2

1

ワーカー スレッド内から UI スレッドを直接更新しないでください。代わりにデリゲートを使用してください。例: C# で別のスレッドから GUI を更新するには?

于 2013-02-04T15:27:30.233 に答える
0

バックグラウンド スレッドが ( 経由でControl.Invoke) UI の呼び出しをブロックし、UI スレッドが Stop メソッドの呼び出しをブロックしているthread.Join()場合、古典的な致命的な抱擁が発生します。Join を取り除き、代わりに、Stop が完了したときにバックグラウンド スレッドに最後のイベント/通知を発生させて、UI がそれを処理できるようにする必要があります (ボタンの有効化/無効化など)。

于 2013-02-04T14:36:22.817 に答える