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。
  • 相关阅读:
    bash:加减乘除(bc、let)
    shell配置文件
    HDU4624 Endless Spin 【最大最小反演】【期望DP】
    SPOJ10707 COT2
    HDU5977 Garden of Eden 【FMT】【树形DP】
    Codeforces1023E Down or Right 【贪心】
    Codeforces1023F Mobile Phone Network 【并查集】【最小生成树】
    UOJ272 [清华集训2016] 石家庄的工人阶级队伍比较坚强 【分治乘法】
    LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
    UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】
  • 原文地址:https://www.cnblogs.com/netwenchao/p/1608374.html
Copyright © 2011-2022 走看看