开发者

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜