Controlling form elements from a different thread in Windows Mobile
Trying to get a thread to change form controls in Windows Mobile.
Throws开发者_JAVA百科 an unsupported exception.
Does this mean it cant be done at all?
If not, how do I go about this? Forms are created in the Parent/Main thread then a thread is created to do some work in the background but I want to make it so the Background thread can update the form to show its completed...
You cannot access GUI items on a non-GUI thread. You will need to determine if an invocation is required to the GUI thread. For example (here's some I made earlier):
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;
}
}
Or
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);
}
}
You can then set the enabled property (from my first example) using ClassName.SetEnabledState(this, true);
.
You need to use the Control.InvokeRequired
property as UI elements must be accessed from the main thread.
In your background thread you raise an event.
public event EventHandler<MyEventArgs> MyApp_MyEvent;
this.MyApp_MyEvent(this, new MyEventArgs(MyArg));
In you main UI thread you subscribe to that event:
this.myThread.MyApp_MyEvent+= this.MyAppEventHandler;
and the handler itself:
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);
}
}
See Also:
- Force Multi-threaded VB.NET Class to Dsplay Results on a Single Form
- Bring data came from async operation to main thread.
- Update UI from multiple worker threads (.NET)
- C# Thread issues
- How can you tell if you’re on the Main UI thread? (In CF)
- Separation of GUI and logic in different threads in a Windows Form application
精彩评论