フォームを閉じるために実行中にBackgroundWorker DoWork()プロセスを完全に停止したいとします。バックグラウンドワーカーを停止してフォームを閉じるには?
私は次のコードを適用しましたが、 "this.Invoke"では "ウィンドウハンドルが作成されるまで、InvokeまたはBeginInvokeをコントロールで呼び出すことはできません"というエラーがスローされます。フォームを閉じる間。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
var dt_Images = db.Rings.Select(I => new { I.PaidRs, I.TypeID, I.RingID, I.CodeNo, Image = Image.FromStream(new MemoryStream(I.Image.ToArray())) }).OrderByDescending(r => r.TypeID);
foreach (var dr in dt_Images.ThenByDescending(r => r.RingID).ToList())
{
BTN = new Button();
BTN.TextImageRelation = TextImageRelation.TextAboveImage;
BTN.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
BTN.AutoSize = true;
BTN.Name = dr.RingID.ToString();
BTN.Image = dr.Image;
BTN.Text = dr.CodeNo.ToString() + " " + dr.TypeID.ToString();
this.Invoke(new MethodInvoker(delegate { if (backgroundWorker1 != null) flowLayoutPanel1.Controls.Add(BTN); else return; }));
BTN.Click += new EventHandler(this.pic_Click);
this.Invoke(new MethodInvoker(delegate { if (backgroundWorker1 == null) txt_pcs.Text = flowLayoutPanel1.Controls.Count.ToString(); else return;}));
}
}
private void Form_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Escape)
{
backgroundWorker1.CancelAsync(); //backgroundworker doesnt stop here
backgroundWorker1 = null; //it still invokes the delegate
this.Dispose();
}
}
このエラーを解決するにはどうすればよいですか?
私を助けてください。
なぜbackgroundWorker1上AutoResetEventを選択してください。 CancelAsync()?利点はありますか?ちょっと興味があるんだけど。 – RvdK
@PoweRoy:あなたは正しいです。最初の部分は、ワーカーメソッド内で 'CancelAsync'を呼び出して' BackgorundWorker.CancellationPending'をポーリングすることによっても行うことができます。これはほんの少し一般的なもので、単純なバックグラウンドスレッドがワーカとして使用されているときに機能します。 – Groo
このプロセスを使用していますが、このプロセスでは "_workerStopped.WaitOne();"カーソルは待機中です。 @Groo – Tulsi