0

リクエストの説明

データベースからデータを読み取るためにバックグラウンド プロセスを呼び出す必要があるプロジェクトを処理しています。この間、GUI のデータ取得ボタンはグレーに変わり、データが到着すると有効になります。バックグラウンド プロセスから例外がスローされた場合は、ボタンを有効にして、ユーザーが別のリクエストを送信できるようにする必要があります。

問題の説明

データ取得失敗イベントが 1 つバックグラウンド プロセスに追加され、データ取得プロセスで例外が発生したことを 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();
        }
    
    }
    
  • 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

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 に答える