Why the "RunWorkerCompleted" never comes after pressing ENTER?
Code:
using System;
using System.ComponentModel ;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Reflection;
namespace Retriever
{
class Program
{
static void Main(string[] args)
{
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();
bw.CancelAsync();
Thread.Sleep(5000);
}
static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled )
cls.Suspend ();
}
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10000; i++){ Thread.Sleep(1000); Console.WriteLine(i); if (e.Cancel){e.Result = "done"; return ;}} }
}
}
If to hit Enter after running, the bw_RunWorkerCompleted() will be never invoked. Why?
Re: Why the "RunWorkerCompleted" never comes after pressing ENTER?
the code does not compile:
cls.Suspend (); <--- cls does not exist in the current context
You may be running a previously compiled version; not the logic you think
Re: Why the "RunWorkerCompleted" never comes after pressing ENTER?
Code:
...
using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Reflection;
namespace Retriever {
class Program {
static BackgroundWorker bw = new BackgroundWorker();
static void Main(string[] args) {
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
Console.WriteLine("Press ENTER to exit...");
Console.ReadLine();
bw.CancelAsync(); // This only assigns that the thread should be cancelled !!
Thread.Sleep(5000);
}
static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (e.Cancelled)
Console.WriteLine("Cancelled");
//cls.Suspend();
}
static void bw_DoWork(object sender, DoWorkEventArgs e) {
for (int i = 0; i < 10000; i++) {
Thread.Sleep(1000);
Console.WriteLine(i);
if (bw.CancellationPending) {
e.Result = "done";
e.Cancel = true;
return;
}
}
}
}
}
Your backgroundprocess will be assigned to be cancelled but isn't really cancelled yet ( The cancellation is pending until its acknowledged in the loop) , so you will not get workerComleted fired. Use it as I showed and it will do the job