2

C#でBackgroundWorkerを使用するには?

実際には、と呼ばれるメソッドから PDF フォームに入力する操作を実行していますfill()。結果をpdfviewerに表示するのに時間がかかるので、バックグラウンドワーカーを使用して「処理画像」を表示することにし、それを使用してみましたが、それを達成できませんでした

ここに私のコードスニペットがあります:

        private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Invoke((MethodInvoker)delegate()
           {
               ???? 
           }); 
        }

        private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          if (e.Cancelled == true)
          {
          }
          else if (e.Error != null)
          {
          }
          else
          {
           picLoading.SendToBack();
          }
       }

ボタンFILLがクリックされると、Fill メソッドが呼び出されます。

private void btnFill_Click(object sender, EventArgs e)
        {
            if (btnFill.Text == "Fill")
            { 
                bgwLoadFile.RunWorkerAsync();
                picloading.BringToFront();

                Fill();
            }

wat ステートメントを DoWork メソッドに追加する必要があります。FILL() を追加しようとすると、fill が 2 回呼び出されます ...

誰でも私を助けることができます

ありがとう

4

2 に答える 2

5

に追加Fill();してbgwLoadFile_DoWorkから削除するbtnFill_Click

picLoading.SendToBack();エラーやキャンセルがそこに留まるかのように、おそらくその「else」の外側を呼び出すことをお勧めします。

于 2013-03-01T07:43:20.857 に答える
2

それでは、いくつかの答えを見つけてみましょう。

メソッドworker_DoWork()は別のスレッド内で実行されます。そのメソッド内で呼び出すことによりthis.Invoke()、コールを gui スレッドに戻すことになり、バックグラウンド ワーカーの使用が役に立たなくなります。代わりに、worker メソッド内で、時間がかかり、 gui と対話しないメソッドを呼び出す必要があります。この呼び出されたメソッドが結果を生成する場合 (たとえば、戻り値がある場合)、この情報を変数に書き込む必要がありますe.Result

メソッドworker_RunWorkerCompleted()は gui スレッド内で再度呼び出されます。結果を取得して、何らかの形で GUI とやり取りできるようにします。このメソッドは gui スレッドで実行されるため、非常に単純 (または高速) である必要があります。そうしないと、gui が再びフリーズします。

したがって、これらの情報があれば、コードをクリーンアップできます。

private void btnFill_Click(object sender, EventArgs e)
{
    if (btnFill.Text == "Fill")
    { 
        // Update the gui for the user
        // and start our long running task
        // (disable buttons etc, cause the
        // user is still able to click them!).
        picloading.BringToFront();
        bgwLoadFile.RunWorkerAsync();
    }
}

private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
{
    // Let's call the long running task
    // and wait for it's finish.
    Fill();
}

private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // We're back in gui thread.
    // So let us show some results to the user.
    if (e.Cancelled)
    {
        // To support cancellation, the long running
        // method has to check some kind of cancel
        // flag (boolean field) to allow fast exit of it.
        labelMessage.Text = "Operation was cancelled.";
    }
    else if (e.Error != null)
    {
        labelMessage.Text = e.Error.Message;
    }

    // Hide the picture to allow the user
    // to access the gui again.
    // (re-enable buttons again, etc.)
    picLoading.SendToBack();
}
于 2013-03-01T08:13:09.567 に答える