2009-05-16 10 views
0
 if (listBox1.InvokeRequired) 
     { 
      listBox = new StringBuilder(this.listBox1.Text); 
     } 

これは、実行すると、自分のフォームのリストボックスであるlistBox1に対して無効なクロススレッド操作エラーが発生します。 あなたは私にその理由を教えてもらえますか? 私はinvokeRequiredメソッドも使用していますが、リストボックスの内容も変更していません。クロスステム操作エラー

答えて

5

InvokeRequiredは、要素に有効にアクセスするためにInvokeが必要であることを伝えます。それはアクセスを合法にするものではありません。あなたは適切なスレッドに更新をプッシュするinvokeメソッドを使用する必要があります

Action update =() => listbox = new StringBuilder(this.listBox1.Text); 
if (listBox1.InvokeRequired) { 
    listBox1.Invoke(update); 
} else { 
    update(); 
} 
+0

MSはセパットラインでブレースを開いていたのですか? ;) –

+0

@Mitch、MSには正式なスタイルはありませんが、多くのグループが改行規則でブレースを使用しています。それは私のCスタイルの言語の好みです。しかし、Webにコードを投稿すると、同じラインスタイルを使用してサンプルをより簡潔にしています:) – JaredPar

+0

Monoプロジェクトは実際にはすべてのソースに対してMicrosoft/StyleCopガイドラインと完全に同じライン慣行を指定しています。彼らは対照的に唯一のことです。それでは、なぜ彼らはMicrosoftの例に従うべきですか?しかし、MS開発者を嫌っているのかどうか疑問に思います。 :P私は同じ行スタイルが個人的にはちょっと醜いようですが、ちょうどうさぎです。いずれにせよ、それは確かに受け入れられる*。 – Noldorin

3

InvokeRequiredは、単にInvokeが必要かどうかを確認するだけです。あなたはそれが必須であることを発見しましたが、Invokeを呼び出さなかったのです!

2

InvokeRequiredがfalseの場合、実行する必要がありますあなたのコードを編集

delegate void SetListBoxDelegate(); 

void SetListBox() 
{ 
    if(!InvokeRequired) 
    { 
     listBox = new StringBuilder(this.listBox1.Text); 
    } 
    else 
     Invoke(new SetListBoxDelegate(SetListBox)); 
} 

:私はブレーススタイルを考え チェックアウトMaking Windows Forms thread safe