WinCE 中的线程同步

本文关键字:同步 线程 WinCE | 更新日期: 2023-09-27 17:57:20

我遇到了线程同步的问题。我的演示者分析了一些传感器并更新 UI 窗体。我将更新代码移动到单独的线程中。它工作正常,但是如果用户在更新视图时停止演示器,软件就会冻结 - 我发现它在查看时发生。更新UI工作(它只是使用调用设置了一些标签)。我的问题在哪里?我使用紧凑型框架 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(...);
    }
  }
}

WinCE 中的线程同步

不要直接从工作线程中更新 UI 线程。请改用委托。例如:如何在 C# 中从另一个线程更新 GUI?

如果您的后台线程被阻止调用您的 UI(通过 Control.Invoke ),然后您的 UI 线程被阻止调用您的 Stop 方法及其thread.Join()那么您就得到了一个经典的致命拥抱。 您应该摆脱 Join,而是让后台线程在停止完成时引发最后一个事件/通知,以便 UI 可以处理(启用/禁用按钮等)。