c# - Form freezing using BackgroundWorker -


i'm working winform processes need steered. i'm trying integrate backgroundworker progressbar , cancellation button code. want locally around code , not in separate method. test this, new form created progress bar (not active yet) , button stop for-loop. however, code not working (and progress bar not included yet). form freezes (see image) can't test cancel button. for-loop, however, executed , "done: " + l.tostring() shown. how can solve this?

void stopmeasurement(object sender, eventargs e)  {     stopmeas = true;     }  public void testcancel() // test method triggered manually {     int l = 0;      metingprogress metingprogress = new metingprogress();     metingprogress.btncancelmeting.click += new eventhandler(stopmeasurement);      backgroundworker worker = new backgroundworker();     worker.workersupportscancellation = true;     worker.dowork += (sender, args) =>     {                                (int k = 0; k < 10; k++)         {             thread.sleep(1000);             l++;              if (worker.cancellationpending)                 break;         }          messagebox.show("done: " + l.tostring());      };     worker.runworkerasync();       while (worker.isbusy)      {         if (stopmeas)             worker.cancelasync();     }      metingprogress.dispose();     messagebox.show("all done");  } 

enter image description here

the form freezes immediately

this because have while loop still running on main thread! form not responsive. called buisy waiting. not able call cancelasync method.

one solution remove while-loop , place cancel call button event code:

void stopmeasurement(object sender, eventargs e) {     stopmeas = true;     worker.cancelasync();  } 

what have done is: created second cancelation token. possibility use stopmeas cancel background operation:

worker.dowork += (sender, args) => {                            (int k = 0; k < 10; k++)     {         thread.sleep(1000);         l++;          if (stopmeas)             break;     }      string mes = stopmeas ? "done: " + l.tostring() : "task aborted!";     messagebox.show(mes);  }; 

edit: line:

metingprogress.dispose(); 

might lead objectdisposed exception. if background process still running , trying update progressbar , dispose form. should remove line , leave garbage collector.


Comments

Popular posts from this blog

python - Operations inside variables -

Generic Map Parameter java -

arrays - What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? -