Controlling form elements from a different thread in Windows Mobile

前端 未结 3 381
庸人自扰
庸人自扰 2021-01-23 16:06

Trying to get a thread to change form controls in Windows Mobile.

Throws an unsupported exception.

Does this mean it cant be done at all?

If not, how do

相关标签:
3条回答
  • 2021-01-23 16:44

    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);.

    0 讨论(0)
  • 2021-01-23 16:44

    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);
        }
    }
    
    0 讨论(0)
  • 2021-01-23 16:56

    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 讨论(0)
提交回复
热议问题