如何以线程安全的方式更新控件

Gih*_*dha 3 c# backgroundworker thread-safety visual-studio-2010 winforms

我有一个windows.form.userControl类,在运行时我想动态添加一些链接标签.当我在Load方法中应用此代码片段时,它完美地工作.

for (int i = 0; i < 10; i++)
     {
       linkLabel = new System.Windows.Forms.LinkLabel();
       linkLabel.Name = i.ToString();
       linkLabel.Text = i.ToString();
       linkLabel.LinkClicked += new  System.Windows.Forms.LinkLabelLinkClickedEventHandler(linkLabel_LinkClicked);
       this.Controls.Add(linkLabel);
       linkLabel.Top = top;
       top += 30;
      }
Run Code Online (Sandbox Code Playgroud)

但是,当我将此代码段移到backgroudworker doWork方法中时,它将在此行中提供与交叉线程问题相关的无效操作异常: - this.Controls.Add(linkLabel);

如何将其作为线程安全操作?我是C#的新手,我正在使用VS 2010使用C#4.0.提前感谢.

Ste*_*cya 6

您应切换到创建该控件的线程以与其进行交互

使用此代码来解决此问题

if(this.InvokeRequired)
   this.Invoke(new Action(() => {this.Controls.Add(linkLabel);}));
else
   this.Controls.Add(linkLabel); 
Run Code Online (Sandbox Code Playgroud)

  • 我会用整个方法调用invoke,因为你的示例将导致十次调用`Control.Invoke`而不是一次. (2认同)