2017-04-20 19 views
0

データベース接続が失われたときにwinformsのバックカラーを変更します。私はデリゲートを介してこれをやっています:フォームの背景色を変更するときに、異なるコントロールのクロススレッド無効操作を取得する

private void SetOfflineBackColor(Color color) 
    { 
     if (InvokeRequired) 
     { 
      SetOfflineBackground d = SetOfflineBackColor; 

      Invoke(d,BackColor = color); 
     } 
     else 
     { 

      BackColor = DefaultBackColor; 
     } 
    } 

それはうまくいきます。しかし、別のコントロール、テキストボックス、私は今呼び出し呼び出しを行うときにクロススレッドエラーを投げている。私はこのテキストボックスがなぜインボークに含まれているのか理解できません。 ダイビングをして理由を確認する方法はありますか、または私の電話で何か不足していますか?

答えて

2

あなたははるかに読みやすい、このパターンを、使用することができます。 それはのための同等のタラです:

var rslt = BackColor = color; 
Invoke(d, rslt); 

そして、問題はBackColorプロパティにassignementは、非UIスレッドにまだあるあります。

+0

これは機能しましたが、SetOfflineBackgroundを直接呼び出すことができませんでした。デリゲート変数を作成する必要がありました。ちょうどFYI – rigamonk

+0

@rigamonkありがとう、私はソースコードを編集しました – TcKs

0

呼び出し呼び出しで割り当てがあるようです。何の呼び出しが必要とされないときは、色パラメータを無視するので

Invoke(d, color); 

または

Invoke(new Action(() => BackColor = color)); 

Invoke(d,BackColor = color); 

を変更してみてください。あなたのコード内

private void SetOfflineBackColor(Color color) 
{ 
    // if method is called from another thread, it will be enqued to the dispatcher 
    if (InvokeRequired) { 
     Action<Color> action = SetOfflineBackground; 
     Invoke(action, color); 
     return; 
    } 

    // now you can continue as usual 
    BackColor = color; 
} 

問題はInvoke(d,BackColor = color);である:

+0

これを試してもバックカラーはまったく変わりません。 – rigamonk