呼び出しは、複数のスレッドアクセスエラーとの間のコントロールを使用して解決しました

呼び出しは、複数のスレッドアクセスエラーとの間のコントロールを使用して解決しました

ボタン(ボタン1)とテキストボックス(textBox1テキストボックス)、ボタン1クリックイベントハンドラでの新しいスレッドを作成し、新しいスレッドに値をtextBox1テキストボックスを変更することを期待するのWinFormインターフェイスであり、以下のようにエラーが発生しやすいコードです

//  ボタンのクリックイベントハンドラ プライベートのボイド のbutton1_Click(オブジェクト 送信者、EventArgsのE){ // 新しいスレッドを作成する    スレッドprocessorThread  = ヌル;     processorThread  = 新しい新しい スレッド(新しい新しい 完了ThreadStart());     processorThread.IsBackground  = trueに    processorThread.SetApartmentState( ApartmentState.STA);     processorThread.Start(); } //  更新値textBox1テキストボックスプライベートボイド 完了(){     textBox1.Text  = " www.mzwu.com "
 

    

 
 
 





 

  ;
}
 

スレッド間の不正な操作を::示唆、プログラムエラーを実行するために、ボタンをクリックしてコントロールは「textBox1テキストボックス」のスレッドからアクセスするために作成されていません。我々はこの問題を解決するために呼び出しを使用して、以下の:

//  ボタンのクリックイベントハンドラ プライベートのボイド のbutton1_Click(オブジェクト 送信者、EventArgsのE){ // 新しいスレッドを作成する    スレッドprocessorThread  = ヌル;     processorThread  = 新しい新しい スレッド(新しい新しい 完了ThreadStart());     processorThread.IsBackground  = trueに    processorThread.SetApartmentState( ApartmentState.STA);     processorThread.Start(); } //  代表者に定義するデリゲートボイド WriteInvoke(文字列 MSG); プライベート無効 書き込み(文字列
 

    

 
 
 





 

   MSG)
{
    textBox1.Text 
=  MSG。
}

//  更新textBox1テキストボックス值 プライベートボイド 完了(){ この.Invoke(新しい WriteInvoke(書き込み)、  新しいオブジェクト[] {  " www.mzwu.com "  })。}
 

    
 

 

更新に成功!

要約すると:この操作はスレッドセーフではないので、現在のスレッドで、オブジェクトをインスタンス化し、他のスレッドで直接呼び出しを許可していない、コンパイラは禁止されています。しかし、私たちはしばしば、このような二次スレッドの作成など、Webクライアントオブジェクトは、セカンダリスレッドで作成された情報を送信するために使用し、メインスレッドでオブジェクトへのフィードバック情報を受信すると、この目的を達成したいです。その後、我々は、メインステップに到達するための方法のデリゲートを使用することができます更新する必要があり、個別の更新機能で記述されたオブジェクトの元の違法判決を呼び出す機能の委譲クラスおよびシリーズの更新機能がインスタンス化されて定義し、最終的に所定の位置にInvokeメソッドを呼び出すことです自分の目標を達成します。

ます。https://www.cnblogs.com/mashang/archive/2009/08/01/1536706.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33860147/article/details/94160862
おすすめ