I have a background worker that does basically the following:
- Find next available file and mark it as in process
- Process the file and s开发者_如何学编程ave the updated version as a new file
- Mark the original as processed
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?
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
}
}
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;
}
}
}
精彩评论