リクエストの説明
データベースからデータを読み取るためにバックグラウンド プロセスを呼び出す必要があるプロジェクトを処理しています。この間、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