「Androidは電気羊の夢を見るか」を読みたい管理者のブログ

仕事などでの色々な発見を記事にしてます。不定期更新。

BackGroundWorkerではまった もしくはBackgroundWorkerのBackGroundWorkの止め方について

今時あまり使われなくなりつつあるC#.NETなわけですが。

わがブログはWPFの記事が読まれることが多いですね。仕事で使わなくなったのでWPFの記事は滅相書かなくなりましたけどね。ニッチな市場で生き残るという方法があるんだってことを知りました。

どうでもいいですが。

BackgroundWorkerではまった

BackgroundWorker bw = new BackgroundWorker();
Program p = new Program();
bw.DoWork += new DoWorkEventHandler(p.AsyncWorker);
bw.WorkerSupportsCancellation = true;
bw.RunWorkerAsync();
bw.CancelAsync();

って書けば、要するにbw.CancelAsync();さえ書いとけばBackgroundの処理は勝手に止まるんだよね!って思ってたけど止まらない!どうして!!!

ってなったわけです。

Background処理として呼ばれる関数で

        void AsyncWorker(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = sender as BackgroundWorker;

てやって、

bw.CancellationPending

を監視する必要があったのですね。

そうして関数を抜け出す処理を入れてあげる…。

 e.Cancel = true;

とだけしてもダメです。
これは

bw.RunWorkerCompleted

で指定した関数に、
処理がどのような形で終わったのかを知らせるものに過ぎない…。

どういうことだOTL

sample

    class Program
    {
        static void Main(string[] args)
        {
            BackgroundWorker bw = new BackgroundWorker();

            Program p = new Program();

            bw.DoWork += new DoWorkEventHandler(p.AsyncWorker);

            while (true)
            {
                System.Threading.Thread.Sleep(100);
                
                if (Console.Read() == (int)System.Windows.Forms.Keys.Enter)
                {
                    bw.CancelAsync();
                }
            }
        }

        void AsyncWorker(object sender, DoWorkEventArgs e)
        {
            var bw = sender as BackgroundWorker;
            //
            while (true)
            {
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
                System.Threading.Thread.Sleep(100);
                Console.WriteLine("test");
            }
        }
    }

Thanks

BackgroundWorkerの使い方 - C#:humming bird