您的位置:首页 > 运维架构

Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on

2009-11-22 23:49 411 查看
当您试图从单独的线程更新一个win form时,您将得到如下错误信息:

"Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on."
[align=left] [/align]
[align=left]本文将介绍如何处理此错误:[/align]问题:

[align=left] [/align]
重现该错误, 添加一个 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());
[align=left] [/align]
请确认您所应用的属性的值类型.在上面的Demo中 Text 是一个 string 属性. 这就是我为什么将其转换为String。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐