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

本文关键字:执行 线程 工作 函数调用 后台 | 更新日期: 2023-09-27 18:33:40

>我在后台工作线程上调用一个函数,该函数需要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函数。我希望这两个函数在不同的线程中并行运行。

我该怎么做??

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

试试这个:

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
}

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

Control.Invoke将消息发布到拥有表单窗口的线程的消息队列,并且您可以从已经作为消息处理的按钮Click处理程序执行此操作。因此,Control.Invoke发布到队列的消息只能在Click处理程序退出后进行处理,这正是您观察到的。