在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和逻辑