2

バックグラウンド ワーカーの使用方法については、 msdnおよびスタック交換に関する同様の質問を見てきました。

基本的に、私の機能のアップロードプログラムは実際の作業を行いますが、スレッドが進むにつれてUIの要素(進行状況バーなど)を変更し、イベントを送信して進行状況を変更したいと考えています。私が試したことは以下のとおりです (厳しく編集されています)。動作せず、runworkerasync の呼び出し後にプログラムが切断されたようです。何か単純な問題がありますか、それとも私のコマンドを「他のスレッドに」送信するのが間違っていましたか?

BackgroundWorker backgroundUpload = new System.ComponentModel.BackgroundWorker();

最初のビットは呼び出しです:

        if (backgroundUpload.IsBusy != true)
        {
            backgroundUpload.RunWorkerAsync(work);
                 // a command here for debug purposes (eg a message box) will run
        }
        else
        { //it doesn't go here, this isn't the error}

それからドワーク、ここにたどり着くようには見えません。

    private void backgroundUpload_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        e.Result = UploadProgram((Workload)e.Argument, worker, e); //workload is one of my enums
    }

ここにも到達しないようです。

bool UploadProgram(Workload work, BackgroundWorker worker, DoWorkEventArgs e)
    {
    }

    //also there is progress changed and run worker complete.
4

3 に答える 3

4

イベント ハンドラーをイベントにサブスクライブしますか?

BackgroundWorker backgroundUpload = new System.ComponentModel.BackgroundWorker();
backgroundUpload.DoWork += backgroundUpload_DoWork;
于 2012-12-20T12:22:06.037 に答える
4

ばかげた質問ですが、イベントに登録しましたか?

backgroundUpload.DoWork += backgroundUpload_DoWork;

ファイルをダウンロードする完全な例を次に示します。

于 2012-12-20T12:22:09.283 に答える
2

コードに、BackgroundWorkerがUIと通信できるようにするために必要な配管がありません

これらのプロパティとイベントが正しく設定されていることを確認する必要があります

 .....
 backgroundUpload.DoWork += backgroundUpload_DoWork
 backgroundUpload.ProgressChanged += backgroundUpload_ProgressChanged;
 backgroundUpload.WorkerReportsProgress = true;
 .....   

プログレスバーを更新するUIスレッドで実行されているイベントハンドラーが必要です

private void backgroundUpload_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = (e.ProgressPercentage.ToString() + "%");
}

そして、あなたがファイルをアップロードするために働いている間、

 worker.ReportProgress(percentComplete);
于 2012-12-20T12:28:03.780 に答える