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"); }
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
Post a Comment