Imam taksno kodo, ki mi zazene Execute() vsakic, ko pritisnem na gumb.
Ker imam lahko n funkcij, ki jih zaganjam v ozadju me zanima ce obstaja nacin kako cancel-at BackgroundWorker-ja v takem dizajnu.
Zato ker, ko klicem CancelBg se postavi samo CancellatioPending na true, le-tega pa ne morem gledati v delegatu.
pravzaprav bi rabu enostaven Thread.Abort, ki ga pa BackgroundWorker ne podpira.
Kaka ideja?
Ce nacin ne obstaja, bom pac uporabil lasten Threading class, ampak bi raje uporabil BG worker ce se da.
public class RunBG { BackgroundWorker bw; public delegate void delExecuteTask(); delExecuteTask funcToExecute; public RunBG(delExecuteTask executeFunction) { funcToExecute = executeFunction; bw = new BackgroundWorker(); bw.WorkerReportsProgress = true; bw.WorkerSupportsCancellation = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.RunWorkerAsync(); } void bw_DoWork(object sender, DoWorkEventArgs e) { funcToExecute.Invoke(); } public void CancelBg(object sender, EventArgs e) { bw.CancelAsync(); } } // tole je pac en form, ki ima gumb s katerim laufamo bg procese public class MyForm : Form { // Form stuff private void button2_Click(object sender, EventArgs e) { RunBG run = new RunBG(Execute); } public void Execute() { Thread.Sleep(10000); } }
AndrejT - četrtek, 08. februar 2007
spirit1:> kot če ti kdo nenadoma požene kroglo v glavo... Ekstremist Ja, no... gre za popolnoma isti vzorec...
spirit1 - četrtek, 08. februar 2007
@Andrej:> kot če ti kdo nenadoma požene kroglo v glavo... Ekstremist @Miha:hvala za link.
MihaM - četrtek, 08. februar 2007
spirit1: ja pisuka no... to je nesprejemljivo in pa Thread.Abort ni "zla" funkcija. Ce se jo pravilno uporabi je cisto kul. Mas mogoce kak primer zakaj je tako hudobna? Vse je v detajlih.http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellationTudi če jo pravilno uporabiš (kar ne obstaja) nimaš garancije, da bo tvoja nit počistila za seboj.
AndrejT - četrtek, 08. februar 2007
Vsako nasilno obnašanje do izvajajočih se niti bi morali kaznovati Vsaka operacija naj bi sama kontrolirala svojo življensko pot, sprejema lahko le predloge za predčasen konec (kar počne BackgroundWorker). Uporaba Thread.Abort v .NET je podobno kot navodilo uporabniku, naj namesto File | Close v Wordu uporablja End Task v Task Managerju oz. kot če ti kdo nenadoma požene kroglo v glavo... Tudi če je uporabljena pravilno, ne zgleda lepo.
spirit1 - sreda, 07. februar 2007
ja pisuka no... to je nesprejemljivo in pa Thread.Abort ni "zla" funkcija. Ce se jo pravilno uporabi je cisto kul. Mas mogoce kak primer zakaj je tako hudobna?Thanx.
MihaM - sreda, 07. februar 2007
Ne, je že prav tako (z namenom).Thread.Abort je namreč zla funkcija, ki se je ne sme uporabljat. Je namreč zelo problematična in zna proizvest čudne stvari.Bo potrebno kar zavihat rokave in dodat kake tri vrstice
spirit1 - sreda, 07. februar 2007
ja ampak to pomeni da morem potem v vsaki Execute (ali kateri drugi z istim podpisom) funckiji upostevati ta cancelationPending, ne?ne morjo enostavno dat BackgroudWroker.RunnerThread.Abort() pa bi blo...
MihaM - sreda, 07. februar 2007
BackgroundWorker ti preda tistole zastavice, da veš, da mora *tvoja* koda prekiniti izvajanje. Tvojemu delegatu pač predaj instanco backgroundworkerja kot argument, pa bo. Verjetno pa lahko tudi uporabiš kar (BackgroundWorker)sender argument v isti namen.