zoukankan      html  css  js  c++  java
  • Crossthread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on

    当您试图从单独的线程更新一个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。
  • 相关阅读:
    SCI写作经典替换词,瞬间高大上!(转)
    最佳化常用测试函数 Optimization Test functions
    算法复杂度速查表
    VS 代码行统计
    CPLEX IDE 菜单栏语言设置( 中文 英文 韩文 等多国语言 设置)
    如何从PDF文件中提取矢量图
    Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
    visual studio 资源视图 空白 解决方案
    MFC DialogBar 按钮灰色不响应
    嗨翻C语言笔记(二)
  • 原文地址:https://www.cnblogs.com/netwenchao/p/1608374.html
Copyright © 2011-2022 走看看