我在后台工作线程上调用一个函数,它需要ListBox
作为参数传递,该参数在主线程上初始化。我正在使用以下代码
private void simpleButton1_Click(object sender, EventArgs e)
{
bw.RunWorkerAsync();
GetData()
}
void bw_DoWork(object sender,DoWorkEventArgs e)
{
this.Invoke(new MethodInvoker(delegate
{
ShowLoadingPanel(listBox);
}));
}
private void GetData()
{
for (int i = 0; i < 500000; i++)
{
datatable.Rows.Add(new object[] { "raj", "raj", "raj", i });
}
}
void ShowLoadingPanel(Control control)
{
//Doing some work here
}
问题是ShowLoadingPanel
函数只在GetData
函数完成执行后调用。我希望这两个函数在不同的线程中并行运行。
我怎么能这样做?
答案 0 :(得分:1)
试试这个:
private void simpleButton1_Click(object sender, EventArgs e)
{
ShowLoadingPanel(listBox);
bw.RunWorkerAsync();
}
void bw_DoWork(object sender,DoWorkEventArgs e)
{
GetData();
}
private void GetData()
{
for (int i = 0; i < 500000; i++)
{
datatable.Rows.Add(new object[] { "raj", "raj", "raj", i });
}
}
void ShowLoadingPanel(Control control)
{
//Doing some work here
}
答案 1 :(得分:0)
您的示例没有多大意义:您希望将ShowLoadingPanel
卸载到另一个(非GUI)线程,但是您使用Control.Invoke
执行它,该文档记录为执行指定的委托拥有控件底层窗口句柄的线程。,即在GUI线程上执行。
Control.Invoke
将消息发布到拥有表单窗口的线程的消息队列中,并从按钮Click
处理程序执行,该处理程序已作为消息处理。因此,Control.Invoke
发布到队列的消息只能在您的Click
处理程序退出后处理,这正是您所观察到的。