0

请求说明

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

问题描述

在后台进程中添加了一个获取数据失败事件,以让 UI 线程注意到获取数据进程遇到了异常。但是由于在不同的线程中运行,因此无法在事件处理函数中更改按钮的状态。

相关代码片段

  • 后台线程代码

    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();
        }
    
    }
    
  • 图形用户界面代码

    //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

4

1 回答 1

2

您必须将其调用回 UI 线程

private void GetDataFailedEventHander_EnableButtonState(object s, EventArgs e)
{
    base.Invoke((Action)delegate { btnGet.Enabled = true; }); 
}
于 2013-02-01T03:18:38.000 回答