あなたが別のスレッドからの勝利のフォームを更新しようとすると、次のエラーメッセージが表示されます。
「有効でないクロススレッド操作:コントロール 『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());
转载于:https://www.cnblogs.com/netwenchao/archive/2009/11/22/1608374.html