从单独的线程访问表单的控件

Cha*_*kay 13 c# multithreading winforms

我正在练习线程并遇到了这个问题.情况是这样的:

  1. 我在一个表单上有4个进度条,一个用于下载文件,一个用于显示页面加载状态等...

  2. 我必须从一个单独的线程控制每个ProgressBar的进度.

问题是,我得到一个出现InvalidOperationException它说

跨线程操作无效:控制'progressBar1'从其创建的线程以外的线程访问.

我在这种方法上错了,还是有人能告诉我如何实现这个?

ebb*_*ebb 43

Control只能在创建它的线程(UI线程)中访问A.

你必须做类似的事情:

Invoke(new Action(() =>
{
    progressBar1.Value = newValue;
}));
Run Code Online (Sandbox Code Playgroud)

然后,invoke方法在UI线程上执行给定的委托.


Pet*_*lly 13

您可以检查Control.InvokeRequired标志,然后根据需要使用Control.Invoke方法.Control.Invoke接受委托,因此您可以使用内置的Action <T>.

public void UpdateProgress(int percentComplete)
{
   if (!InvokeRequired)
   {
      ProgressBar.Value = percentComplete;
   }
   else
   {
      Invoke(new Action<int>(UpdateProgress), percentComplete);
   }
}
Run Code Online (Sandbox Code Playgroud)


Den*_*aub 9

UI元素只能由UI线程访问.WinForms和WPF/Silverlight不允许从多个线程访问控件.

可以在此处找到解决此限制的方法.


小智 6

 private void Form1_Load(object sender, EventArgs e)
    {
        CheckForIllegalCrossThreadCalls = false;
    }
Run Code Online (Sandbox Code Playgroud)

也许这会奏效.

  • 这将阻止错误出现,但实际上并不能解决问题。该线程中已经有其他更好的答案,它们实际上解决了问题,并有助于更好地理解它首先发生的原因。 (5认同)
  • 不会认可这种方式,但它的工作原理:-) (2认同)