0

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この2つの関数を異なるスレッドで並行して実行したい.

これどうやってするの ??

4

2 に答える 2

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
}
于 2013-10-03T12:19:13.717 に答える
0

ShowLoadingPanelあなたの例はあまり意味がありません:別の (GUI 以外の) スレッドにオフロードしたいのですが、コントロールの基になるウィンドウ ハンドルを所有するスレッドで指定されたデリゲートを実行するControl.Invokeとして文書化されているスレッドを実行します。つまり、GUI スレッドで実行されます。

Control.Invokeフォーム ウィンドウを所有するスレッドのメッセージ キューにメッセージを投稿し、Click既にメッセージとして処理されているボタン ハンドラーからそれを行います。したがって、によってキューに投稿されたメッセージはControl.Invoke、ハンドラーが終了した後にのみ処理できClickます。これはまさに観察したとおりです。

于 2013-10-03T12:10:17.323 に答える