C# 后台工作线程中的函数调用仅在主线程执行完成后执行?

C# 后台工作线程中的函数调用仅在主线程执行完成后执行?,c#,multithreading,winforms,backgroundworker,C#,Multithreading,Winforms,Backgroundworker,我在后台工作线程上调用一个函数,该函数要求ListBox作为参数传递,该参数在主线程上初始化。我用下面的代码来做 private void simpleButton1_Click(object sender, EventArgs e) { bw.RunWorkerAsync(); GetData() } void bw_DoWork(object sender,DoWorkEv

我在后台工作线程上调用一个函数,该函数要求
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
   }
private void simpleButton1_单击(对象发送方,事件参数e)
{            
RunWorkerAsync();
GetData()
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{           
this.Invoke(新方法调用器(委托
{
显示加载面板(列表框);
}));            
}
私有void GetData()
{
对于(int i=0;i<500000;i++)
{
添加(新对象[]{“raj”,“raj”,“raj”,i});
}
}
无效显示加载面板(控制)
{
//在这里做些工作
}
问题是
ShowLoadingPanel
函数只有在
GetData
函数完成执行后才调用。我希望这两个函数在不同的线程中并行运行


我该怎么做

您的示例没有多大意义:您想将
ShowLoadingPanel
卸载到另一个(非GUI)线程,但您执行它时,它被记录为在拥有控件底层窗口句柄的线程上执行指定的委托,即在GUI线程上执行

Control.Invoke
将消息发布到拥有表单窗口的线程的消息队列中,您可以通过按钮
单击
处理程序来执行此操作,该处理程序已作为消息处理。因此,
Control.Invoke发布到队列的消息只有在
单击
处理程序退出后才能处理,这正是您观察到的情况。

尝试以下操作:

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
}
private void simpleButton1_单击(对象发送方,事件参数e)
{        
显示加载面板(列表框);
RunWorkerAsync();
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{           
GetData();
}
私有void GetData()
{
对于(int i=0;i<500000;i++)
{
添加(新对象[]{“raj”,“raj”,“raj”,i});
}
}
无效显示加载面板(控制)
{
//在这里做些工作
}

如果在UI线程中完成所有作业,为什么要使用
BackgroundWorker
?GetData和ShowLoadingPanel都在UI线程上运行。它一次只能做一件事。这里的典型错误是,你是在倒退。在worker中运行的应该是GetData()。让UI线程显示“加载面板”。@HansPassant我知道,将其反转可以实现此目的。但我的应用程序中没有网格。我需要所有的数据检索在后台显示加载面板。这就是为什么我在寻找一些不同的东西,为了两个函数同时运行,我能做些什么。。当我将listbox作为参数传递到函数中时,它会导致跨线程异常的其他方面的异常。无论如何,您应该只修改GUI线程上的控件,所以您不应该并行执行。慢的部分到底是什么?在winform中填充数据时,我需要显示加载面板之类的控件。什么是加载面板,类似于微调器图像?是的,类似于gif动画图像,它让用户意识到数据是像等待表单一样填充的。谢谢Eli,我知道这会正确完成。。但是我需要在后台运行
ShowLoadingPanel
函数!!!