0

バックグラウンドワーカーを使用して別のスレッドを実行していますが、 の呼び出し後にプログラムが停止しているようRunWorkerAssync()です。

すべてを設定した場所は次のとおりです。

   BackgroundWorker worker = new BackgroundWorker();
   worker.WorkerSupportsCancellation = false;
   worker.WorkerReportsProgress = true;
   worker.DoWork += new DoWorkEventHandler(bw_DoWork);
   worker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
   worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
   worker.RunWorkerAsync();
   console.writeline("I'm Done!");

そして、ここに私のbw_DoWork機能があります:

private void bw_DoWork(object sender, DoWorkEventArgs e)
    {

        System.Threading.Thread.Sleep(5000);

    }

そして私bw_RunWorkerCompletedbw_ProgressChanged

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if ((e.Cancelled == true))
        {

        }

        else if (!(e.Error == null))
        {

        }

        else
        {

        }
    }

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

    }

私が抱えている問題は、確かに、実行後 5 秒までコンソール出力が得られないことです。スリープをより長い/より短い時間に変更すると、それに応じてコンソール出力の待機が調整されます。

バックグラウンド ワーカーを使用して、プログラムの実行中にタスクを別のスレッドに移動できるようにするのがポイントではありませんか? または、何か不足していますか?

ありがとう

4

1 に答える 1

1

以下の簡単なアプリケーションは、期待どおりに機能します。「やったー!」と書いてあります。すぐに、5 秒後に「完了」します。プログラムで行っているかもしれない異常なことは何か考えられますか?

using System;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BackgroundWorker worker = new BackgroundWorker();
            worker.WorkerSupportsCancellation = false;
            worker.WorkerReportsProgress = true;
            worker.DoWork += new DoWorkEventHandler(bw_DoWork);
            worker.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            worker.RunWorkerAsync();
            Console.WriteLine("I'm Done!");
            Console.ReadKey(true);
        }

        private static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("Completed");
        }

        private static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {            
        }

        private static void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            System.Threading.Thread.Sleep(5000);
        }
    }
}
于 2012-06-28T22:44:39.630 に答える