2

BackgroundWorker スレッドを使用して長いタスクを実行しています (基本的には大きな xml ファイルを読み取ります)。初めてワーカーは希望どおりに正常に動作しますが、同じバックグラウンド ワーカーを使用して 2 番目の xml ファイルをアップロードすると、正常に動作することもありますが、ほとんどの場合、バックグラウンドワーカーの RunWorkerCompleted は DoWork イベントの前でも発生します。コードの一部を以下に示します

    private void openFile_Click(object sender, RoutedEventArgs e)
    {
          // Code removed for brevity
  worker = new BackgroundWorker();
            worker.RunWorkerAsync();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.WorkerReportsProgress = true;
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
       }

        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        DataImport();
        //worker.Dispose();
        //worker.Disposed += new EventHandler(worker_Disposed);
        //worker.DoWork -= worker_DoWork;
        //worker.RunWorkerCompleted -= worker_RunWorkerCompleted;
        //worker = null;
        //GC.Collect(GC.GetGeneration(worker), GCCollectionMode.Forced);
    }

worker はグローバルに定義された変数です。ここで何が間違っているのですか?親切に助けて

4

4 に答える 4

9

を呼び出す前にDoWork、 -event ハンドラー (および他のすべてのイベント ハンドラー)を追加する必要があります。RunWorkerAsync()

そうしないと、RunWorkerAsync実質的に何もしないことが起こる可能性があります。

于 2013-07-29T13:38:54.890 に答える
2

次のようになります。

worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;

worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += 
    new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += 
    new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);

worker.RunWorkerAsync();

RunWorkerAsyncDoWorkおよびイベントをサブスクライブした後に呼び出す必要がありRunWokerCompletedます。

于 2013-07-29T13:47:42.690 に答える