The checking should be inside the loop where you are iterating. Your code
seems to be OK.
I suggest you should first try some simple testings on both development and
production machines.
Following is a test code for your.
1. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e
)
2. {
3. BackgroundWorker b = (BackgroundWorker)sender;
4. for (int i = 0; i < 5; i++)
5. {
6. DateTime d = DateTime.Now;
7. // wait for 2 seconds simulating a long operation
8. while (((TimeSpan)DateTime.Now.Subtract(d)).Seconds <
2) ;
9. // update count in textbox
10. this.updatecount(i);
11. // if cancel request is pending
12. if (b.CancellationPending) {
13. e.Cancel = true;
14. break;
15. }
16. }
17. }
18.
19. private delegate void updatecountdelegate(int i);
20. private void updatecount(int i)
21. {
22. if (this.textBox1.InvokeRequired)
23.
this.textBox1.Invoke(new<http://www.google.com/search?q=new+msdn.microsoft.com>
updatecountdelegate(updatecount), i);
24. else
25. this.textBox1.Text = i.ToString();
26.
27. }
28.
29. private void BW_Complete(object sender,
RunWorkerCompletedEventArgs e)
30. {
31. MessageBox.Show("Operation" + (e.Cancelled ? " was
cancelled" : " completed successfully"));
32. this.btnStart.Enabled = true;
33. }
34.
35. private void btnStart_Click(object sender, EventArgs e)
36. {
37. this.btnStart.Enabled = false;
38. this.btnStop.Enabled = true;
39. this.backgroundWorker1.RunWorkerAsync();
40. }
41.
42. private void btnStop_Click(object sender, EventArgs e)
43. {
44. this.btnStop.Enabled = false;
45. this.backgroundWorker1.CancelAsync();
46. }
On Fri, Oct 16, 2009 at 2:36 PM, Benj Nunez <[email protected]> wrote:
>
> Hello Arsalan,
>
>
> I looked into my code again and confirmed that the CancellationPending
> property
> has already been implemented. Still no go. :(
>
> Originally the call to CancellationPending is within a foreach loop
> like this:
>
>
> public bool parseEntries(ref BackgroundWorker worker,
> ref List<StringHolder> ACVMEntries,
> ref DoWorkEventArgs e)
> {
> ...
> if (ACVMEntries != null)
> {
> ..
> foreach (StringHolder shEntry in ACVMEntries)
> {
> ...
> if (worker.CancellationPending)
> {
> e.Cancel = true;
> //return false;
> break;
> }
>
> // long work starts here...
> }
> }
>
> }
>
>
> I changed it and tried calling the property *before* the loop like
> this:
>
>
> public bool parseEntries(ref BackgroundWorker worker,
> ref List<StringHolder> ACVMEntries,
> ref DoWorkEventArgs e)
> {
> ...
> if (worker.CancellationPending)
> {
> e.Cancel = true;
> //return false;
> break;
> }
> else
> {
> if (ACVMEntries != null)
> {
> ..
> foreach (StringHolder shEntry in ACVMEntries)
> {
> ...
> // long work starts here...
> } // of foreach
>
> } // of inner if
>
> } // of outer if
>
> }
>
>
> Any help appreciated.
>
>
>
> Benj
>
>
>
>
> On Oct 14, 11:27 am, Benj Nunez <[email protected]> wrote:
> > Hello Arsalan,
> >
> > I will re-write the code under my worker thread to see if
> > CancellationPending will
> > work. This I think, must be it.
> >
> > Thank you,
> >
> > Benj
> >
> > On Oct 13, 6:37 pm, Arsalan Tamiz <[email protected]> wrote:
> >
> > > Andrew is right that you haven't provided any details. But I would like
> to
> > > put some points for you,
> >
> > > According to MSDN,
> > > -----------------
> >
> > > CancelAsync submits a request to terminate the pending background
> operation
> > > and
> >
> > > "sets the CancellationPending<
> http://msdn.microsoft.com/en-us/library/system.componentmodel.backgro...>
> > > property
> > > to true."
> >
> > > When you call CancelAsync, your worker method has an opportunity to
> stop its
> > > execution and exit.
> >
> > > "The worker code should periodically check the
> > > CancellationPending<
> http://msdn.microsoft.com/en-us/library/system.componentmodel.backgro...>
> > > property
> > > to see if it has been set to true."
> >
> > > -----------------
> > > So its your responsibility to check the "CancellationPending" property.
> Are
> > > you checking it? If you are checking then see what statements are being
> > > executed before this "checking". Are those statements being hanged
> > > somewhere?
> >
> > > Regards,
> > > Arsalan Tamiz
> >
> > > On Tue, Oct 13, 2009 at 12:20 PM, Benj Nunez <[email protected]>
> wrote:
> >
> > > > Hello everyone,
> >
> > > > I recently wrote a program that allows users to interrupt a process
> > > > which runs within a thread.
> > > > I have code that looks like this:
> >
> > > > private void btnStop_Click(object sender, EventArgs e)
> > > > {
> > > > bwOverAll.CancelAsync();
> > > > btnStop.Enabled = false;
> > > > }
> >
> > > > I'm not sure if threads rely somewhat on what CPU the PC has. I have
> > > > tested my program to run
> > > > on the following PCs and I can start/stop threads at will with no
> > > > issues:
> >
> > > > PC#1) Windows XP Home with SP3. Intel Pentium D 2.80Ghz, 504mb ram,
> > > > Hyperthreading enabled.
> > > > PC#2) Windows XP Pro with SP3, Intel Pentium 4, 2GB ram,
> > > > Hyperthreading enabled.
> >
> > > > On the production machine however, I checked its specifications to be
> > > > like this:
> >
> > > > PC#3) Windows XP Home, Intel Celeron.
> >
> > > > All three PCs have .net framework 3.5 installed.
> >
> > > > That's all I can remember. But I can check again about its ram and
> > > > clock speed.
> > > > Could you tell me exactly where to first look for in cases like this?
> > > > Normally I expect that
> > > > when I click the button to stop an action (threaded), there's a brief
> > > > delay then the thread eventually stops. But in my case it didn't.
> >
> > > > Any advice?
> >
> > > > Benj