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。
  • 相关阅读:
    Asp.net 后台添加CSS、JS、Meta标签(帮助类)
    Jquery 事件冒泡
    一个例子理解C#位移
    CodeSmith 创建Ado.Net自定义模版(四)
    .NET4.0下网站应用程序用UrlRewriter.dll重写无后缀路径 (在IIS7.5中的配置方法)
    用泛型的IEqualityComparer<T>接口去重复项
    Why MapReduce?
    SYN flood攻击介绍
    tmux使用方法详解
    理解Linux系统负荷
  • 原文地址:https://www.cnblogs.com/netwenchao/p/1608374.html
Copyright © 2011-2022 走看看