<div class=" article-meta>當您試圖從單獨的線程更新一個win form時,您將得到如下錯誤資訊:
"Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on." 本文將介紹如何處理此錯誤:
問題:
重現該錯誤, 添加一個 progress bar 控制項 (progressbar1) 以及一個 button(btnStart)到您的表單上:.
private void btnStart_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
System.Threading.Thread t1 = new System.Threading.Thread(startProgress);
t1.Start();
}
void startProgress()
{
for (int i = 0; i {
progressBar1.Value = i; //You will get error at this line
System.Threading.Thread.Sleep(100);
}
}
window.google_render_ad();
解決方案:
private void btnStart_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
System.Threading.Thread t1 = new System.Threading.Thread(startProgress);
t1.Start();
}
void startProgress()
{
for (int i = 0; i {
SetControlPropertyValue(progressBar1, "value", i); //This is a thread safe method
System.Threading.Thread.Sleep(100);
}
}
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if (oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
PropertyInfo[] props = t.GetProperties();
foreach (PropertyInfo p in props)
{
if (p.Name.ToUpper() == propName.ToUpper())
{
p.SetValue(oControl, propValue, null);
}
}
}
}
您可以通過該解決方案來處理所有的WIndows 控制項. 您所要做的是, 從上方的代碼中copy SetControlValueCallback delegate 以及SetControlPropertyValue 函數 function.
例如您想設定一個 label的內容, 使用SetControlPropertyValueSetControlPropertyValue(Label1, "Text", i.ToString());
請確認您所應用的屬性的實值型別.在上面的Demo中 Text 是一個 string 屬性. 這就是我為什麼將其轉換為String。