访问backgroundworker线程中的主线程控制

时间:2013-10-03 07:04:28

标签: c# multithreading winforms backgroundworker

我有一个函数ShowPanel(Control ctrl),需要将Control作为参数传递。 我需要在后台工作线程中调用此函数。我使用以下代码

void bw_DoWork(object sender,DoWorkEventArgs e)
{                      
    ShowPanel(listBox1);           
}

但是因为execption而失败

  

跨线程操作无效:从a访问控制'Form1'   除了在

上创建的线程以外的线程

如何在后台线程中传递listBox1

2 个答案:

答案 0 :(得分:3)

序列化调用,因为您无法访问在不同线程上创建的控件,您需要使用下面的序列化调用

 void bw_DoWork(object sender,DoWorkEventArgs e)
 {                      
   this.Invoke(new MethodInvoker(delegate {

              ShowPanel(listBox1);           
    })); 
 }

答案 1 :(得分:0)

我想应该有BeginInvoke而不是Invoke。

否则这里是更通用的解决方案。

您需要添加对WindowsBase.dll的引用。

在主线程上获取线程的调度程序:

public class SomeClass
{
    System.Windows.Threading.Dispatcher mainThreadDispatcher;       

    // assuming class is instantiated in a main thread, otherwise get a dispatcher to the
    // main thread
    public SomeClass()
    {
        Dispatcher mainThreadDispatcher = Dispatcher.CurrentDispatcher;
    }

    public void MethodCalledFromBackgroundThread()
    {
        mainThreadDispatcher.BeginInvoke((Action)({() => ShowPanel(listBox1);}));
    }
}