如何通过事件处理程序更改GUI控件状态

时间:2013-02-01 03:00:47

标签: c# multithreading winforms events

请求说明

我正在处理一个需要调用后台进程来从数据库中读取一些数据的项目。 GUI的获取数据按钮在此期间将变为灰色,并在数据到达后变为启用。如果后台进程有任何异常抛出,则该按钮需要转为启用以确保用户可以发送另一个请求。

问题描述

将一个get data failed事件添加到后台进程,让UI线程注意到get数据进程遇到异常。但是由于差异线程中存在运行,因此无法在事件处理函数中更改按钮的状态。

相关代码片段

  • 背景线程代码

    class DataProcessService
    {
        public static SingletonInstance {get;set;} //Omit the codes implement the singleton pattern
        public event EventHandler GetDataFailed;
    
        private void FireGetDataFailed()
        {
           if(GetDataFailed != null) GetDataFailed(this, null);
        }
    
        // in some function 
        try
        {
            // do some get data process
        }
        catch(SqlException ex)
        {
           FireGetDataFailed();
        }
    
    }
    
  • GUI代码

    //In the init function subscribe to the event
    DataProcessService.SingletonInstance.GetDataFailed += new Eventhandler(GetDataFailedEventHander_EnableButtonState);
    
    private void GetDataFailedEventHander_EnableButtonState(object s, EventArgs e)
    {
        btnGet.Enabled = true;  //There will be a exception
    }
    

问题

如何从.net 3.5中的事件处理程序更改UI控件?在.net 4.0中我可以使用TPL来处理这个问题。任何建议将不胜感激,谢谢。

开发环境

VS2008,.net 3.5

1 个答案:

答案 0 :(得分:2)

您必须将其调回UI线程

private void GetDataFailedEventHander_EnableButtonState(object s, EventArgs e)
{
    base.Invoke((Action)delegate { btnGet.Enabled = true; }); 
}