Reputation: 2654
I have a background worker that does basically the following:
The above steps will need to loop and continue processing while there are files to process.
I would like the Background Worker to be able to be stopped, and I see the WorkerSupportsCancellation setting, but how do I ensure that it can only stop between files, not while a file is being processed?
Upvotes: 8
Views: 3651
Reputation: 1176
You have to check CancellationPending procepty of background worker at the end of file processing
static void Main(string[] args)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.WorkerSupportsCancellation = true;
bw.RunWorkerAsync();
Thread.Sleep(5000);
bw.CancelAsync();
Console.ReadLine();
}
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
string[] files = new string[] {"", "" };
foreach (string file in files)
{
if(((BackgroundWorker)sender).CancellationPending)
{
e.Cancel = true;
//set this code at the end of file processing
return;
}
}
}
Upvotes: 5
Reputation: 22703
Set WorkerSupportsCancellation
to true, and periodically check the CancellationPending
property in the DoWork
event handler.
The CancelAsync
method only sets the CancellationPending
property. It doesn't kill the thread; it's up to the worker to respond to the cancellation request.
e.g.:
private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
while( !myBackgroundWorker.CancellationPending )
{
// Process another file
}
}
Upvotes: 9