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();
{
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。
"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。
相关文章推荐
- 【转发】Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on
- BackgroundWorker .net 2.0 里微软的多线程组件 学习 Cross-thread operation not valid: Control 'RichTextBox1' accessed from a thread other than the thread it was created on.
- Cross-thread operation not valid: accessed from a thread other than the thread it was created on.
- Solved this program:accessed from a thread other than the thread it was created on.
- Assertion failed: Cancelling DisplayDialog because it was run from a thread that is not the main 。。
- 解决 Previous operation has not finihsed; run ‘cleanup’ if it was interrupted Please execute the ‘Cleanup’ command
- 错误:created a ThreadLocal with key of type ……but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
- C#中对"Cross-thread operation not valid"错误的权宜之计
- An object in the SharePoint administrative framework could not be deleted because other objects depend on it.
- Cross-thread operation not valid
- C#中对"Cross-thread operation not valid"错误的处理办法
- redis error It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING
- swagger在本地没问题可是上传至服务器报错解决办法Can't read from server. It may not have the appropriate access-control-or
- 解决Cross-thread operation not valid的问题
- You may not call SetData on a resource while it is actively set on the GraphicsDevice. Unset it from
- Cross-thread operation not valid (转)
- The object or library file 'xxx.obj' was created with an older compiler than other obj
- CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its
- (转)c#中对"Cross-thread operation not valid"错误的处理办法
- 解决Cross-thread operation not valid的问题