我有一个函数ShowPanel(Control ctrl)
,需要将Control
作为参数传递。
我需要在后台工作线程中调用此函数。我使用以下代码
void bw_DoWork(object sender,DoWorkEventArgs e)
{
ShowPanel(listBox1);
}
但是因为execption而失败
跨线程操作无效:从a访问控制'Form1' 除了在
上创建的线程以外的线程
如何在后台线程中传递listBox1
?
答案 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);}));
}
}