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