zoukankan      html  css  js  c++  java
  • 【转发】Cross-thread 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。
  • 相关阅读:
    【2019-12-13】泛型
    【2019-12-12】函数
    【2019-12-10】类
    【2019-12-05】接口
    【2019-12-3】变量声明
    【2019-11-24】基础类型
    【2019-11-20】服务与DI简介
    【2019-11-20】组件简介
    android之ListView与Adapter(结合JavaBean)
    android基类Adapter
  • 原文地址:https://www.cnblogs.com/successliwei/p/3839843.html
Copyright © 2011-2022 走看看