WinCE中的线程同步

时间:2013-02-04 11:58:22

标签: c# winforms compact-framework windows-ce thread-synchronization

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

2 个答案:

答案 0 :(得分:1)

不要直接从工作线程中更新UI线程。请改为使用委托。 例如:How to update the GUI from another thread in C#?

答案 1 :(得分:0)

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