在Windows Mobile中控制来自不同线程的表单元素

尝试获取一个线程来更改Windows Mobile中的表单控件。

引发不受支持的exception。

这是否意味着它根本无法完成?

如果没有,我该怎么做呢? 在父/主线程中创建表单,然后创建一个线程在后台执行一些工作,但我想这样做,以便后台线程可以更新表单以显示其完成…

您无法访问非GUI线程上的GUI项。 您需要确定GUI线程是否需要调用。 例如(这是我之前制作的一些):

public delegate void SetEnabledStateCallBack(Control control, bool enabled); public static void SetEnabledState(Control control, bool enabled) { if (control.InvokeRequired) { SetEnabledStateCallBack d = new SetEnabledStateCallBack(SetEnabledState); control.Invoke(d, new object[] { control, enabled }); } else { control.Enabled = enabled; } } 

要么

 public delegate void AddListViewItemCallBack(ListView control, ListViewItem item); public static void AddListViewItem(ListView control, ListViewItem item) { if (control.InvokeRequired) { AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem); control.Invoke(d, new object[] { control, item }); } else { control.Items.Add(item); } } 

然后,您可以使用ClassName.SetEnabledState(this, true);设置enabled属性(来自我的第一个示例ClassName.SetEnabledState(this, true);

您需要使用Control.InvokeRequired属性,因为必须从主线程访问UI元素。

在你的后台线程中你举起一个事件。

 public event EventHandler MyApp_MyEvent; this.MyApp_MyEvent(this, new MyEventArgs(MyArg)); 

在您的主UI线程中,您订阅了该事件:

 this.myThread.MyApp_MyEvent+= this.MyAppEventHandler; 

和处理程序本身:

 private void MyApp_EventHandler(object sender, MyEventArgs e) { if (this.MyControl.InvokeRequired) { this.MyControl.Invoke((MethodInvoker)delegate { this.MyAction(e.MyArg); }); } else { this.MyAction(e.MyArg); } } 

也可以看看:

  • 强制multithreadingVB.NET类在单个表单上显示结果
  • 将数据从异步操作传递到主线程。
  • 从多个工作线程更新UI(.NET)
  • C#线程问题
  • 你怎么知道你是否在主UI线程上? (在CF中)
  • 在Windows窗体应用程序中的不同线程中分离GUI和逻辑