2012-05-09 12 views
1

メインスレッドを呼び出すためのone-size-fits allユーティリティを作成しようとしました。以下は私が思いついたことです - このようにすることに何か問題がありますか? IsHandleCreatedとIsDisposedの両方が重複していないかチェックしていますか?それが廃棄されると、IsHandleCreatedはfalseに設定されますか? (これはブール値のデフォルト値なので)コントロールのスレッドを呼び出すための拡張ユーティリティ

public static void InvokeMain(this Control Source, Action Code) 
    { 
     try 
     { 
      if (Source == null || !Source.IsHandleCreated || Source.IsDisposed) { return; } 
      if (Source.InvokeRequired) 
      { 
       Source.BeginInvoke(Code); 
      } 
      else 
      { 
       Code.Invoke(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     }  
    } 

ありがとうございます! ウィリアム

+2

のみ'InvokeRequired'がtrueの場合は呼び出しが非同期になり、falseの場合は同期が完了します。 – vcsjones

答えて

0

エラーがあれば私の頭の上から答えるよ。

例外をトラップする必要があり、投げられた場合に対処する方法を知っていない場合は、例外をトラップしないでください。ログに記録される共通のアプリケーションエラーハンドラに達するまで、それは/メッセージを表示するか何でも。

また、コントロールがnullの場合、または初期化されていない場合は、可能性のあるバグを隠していることを意味します。なぜそれをやりたいのですか?私はあなたがコントロールがnullの場合は、(例外ArgumentNullExceptionとして)例外を自分で調達する必要があり、その後にNullPointer例外を持つようにしたい場合は非常に多くは、失敗ではなく、何もせずに返すコールを好む

public static void Invoke(this Control control, Action action) 
{ 
    if (control == null) 
     throw new ArgumentNullException("control"); 

    if (control.InvokeRequired) 
    { 
     control.Invoke(action); 
     return; 
    } 

    action(); 
} 

public static T Invoke<T>(this Control control, Func<T> action) 
{ 
    if (control == null) 
     throw new ArgumentNullException("control"); 

    if (control.InvokeRequired) 
     return (T)control.Invoke(action); 

    return action(); 
} 
関連する問題