1

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

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

但因执行失败

跨线程操作无效:控件“Form1”从创建它的线程以外的线程访问

我怎样才能listBox1在后台线程中通过这里?

4

2 回答 2

5

对调用进行序列化,因为您无法访问在不同线程上创建的控件,因此您需要使用以下命令对调用进行序列化

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

              ShowPanel(listBox1);           
    })); 
 }
于 2013-10-03T07:10:01.763 回答
1

我想应该有 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);}));
    }
}
于 2013-10-03T07:50:06.513 回答