クロススレッド操作ではない有効:threa以外のスレッドからアクセスコントロール「progressBar1の」...

あなたが別のスレッドからの勝利のフォームを更新しようとすると、次のエラーメッセージが表示されます。 

「有効でないクロススレッド操作:コントロール 『progressBar1の』それが作成されたスレッド以外のスレッドからアクセス。」 
 
この資料では、このエラーに対処する方法について説明します。

問題:

 
エラーを再現し、フォームにプログレスバーコントロール(progressBar1の)とボタン(btnStart)を追加:. ます。private void btnStart_Click(SENDERオブジェクト、EventArgsのE){ progressBar1.Minimum = 0; progressBar1.Maximum = 100; T1 = System.Threading.Thread新しい新System.Threading.Thread(startProgress); t1.Start(); } 無効startProgress(){ (I = 0をint型のため、I { progressBar1.Value = I;  //はあなたでエラーが発生しますラインこのAT System.Threading.Thread.Sleep(100); } }

















window.google_render_ad();

ソリューション:

プライベートボイドbtnStart_Click(オブジェクト送信者、のEventArgs電子) { progressBar1.Minimum = 0。progressBar1.Maximum = 100; System.Threading.Thread T1 =新しいSystem.Threading.Thread(startProgress)。t1.Start(); } ボイドstartProgress(){ ; I {(I = 0 int型ためSetControlPropertyValue(progressBar1の、 "値"、I);  //これは、スレッドセーフな方法である。System.Threading.Thread.Sleep(100)} } デリゲート空隙SetControlValueCallback (コントロールoControl、ストリングたpropName、propValueオブジェクト); プライベートボイドSetControlPropertyValue(コントロールoControl、ストリングたpropName、propValueオブジェクト){ IF(oControl.InvokeRequired){





















D =新しい新しいSetControlValueCallback SetControlValueCallback(SetControlPropertyValue); oControl.Invoke(D、新しい新しいオブジェクト[] {oControl、たpropName、PROPVALUE}); } { タイプoControl.GetType = T(); PropertyInfo [] =のt.GetProperties小道具() ; foreachの(PropertyInfoでP小道具){ IF(p.Name.ToUpper()== propName.ToUpper()){ ; p.SetValue(oControl、PROPVALUE、NULL)} } } } あなたは、この溶液によって処理することができますあなたがする必要があるWindowsのすべてのコントロールをコピーし、上記のコードから、ある  SetControlValueCallback デリゲート SetControlPropertyValue関数  機能たとえば、ラベルの内容を設定したい場合は、使用しSetControlPropertyValue
















 

SetControlPropertyValue(Label1を、 "テキスト"、i.ToString());
 
请确认您所应用的属性的值类型.在上面的Demo中 Text 是一个 string 属性. 这就是我为什么将其转换为String。

转载于:https://www.cnblogs.com/netwenchao/archive/2009/11/22/1608374.html

おすすめ

転載: blog.csdn.net/weixin_34055910/article/details/93607837