BackgroundWorker Cancelation problemček

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);
	}
}
Avtor: spirit1, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

AndrejT
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
spirit1 - četrtek, 08. februar 2007

@Andrej:> kot če ti kdo nenadoma požene kroglo v glavo... Ekstremist @Miha:hvala za link.

MihaM
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
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
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
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
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
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.