PDA

View Full Version : [C#]Background Worker


Mattyfog
21-03-2010, 17:25
Sto cercando di capire come funziona il background worker in C# ma ho un po' di difficoltà che spero di capire buttando giù un po' di codice.
Prima di tutto, in termini rozzi a quanto ho capito và impostatata la proprietà DoWorl con la riga qua sotto:

backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(nome della funzione);

Ora, se io volessi impostare come funzione "legata al .DoWork" una funzione presente in un altra classe, come faccio?

Mattyfog
22-03-2010, 15:42
Nada?

flx2000
23-03-2010, 00:34
Se il metodo della classe è accessibile puoi richiamarlo come
backgroundWorker.DoWork += DoWorkEventHandler(QuellaClasse.QuelMetodo);

Tieni presente che dentro al quel metodo non puoi manipolare direttamente le variabili del programma principale. Per farlo dovrai usare l'apposito ReportProgress

Mattyfog
23-03-2010, 06:22
Ok e se non è accessibile (perchè si trova in un altro file) per renderla tale devo scrivere

new nomeclasse nomevariabile = news nomeclasse();

Giusto? Non ci sono altri modi?
Ma reportprogress non serve solo per sapere a che punto è "il lavoro"?

flx2000
23-03-2010, 10:10
Il parametro di DoWorkEventHandler è il nome del metodo da eseguire quando dai lo StartAsync a quel background worker.

Non riesco a immaginare come sia strutturato il tuo codice se hai un problema di questo tipo, perché potresti creare una classe che estende BackgroundWorker e risolvere tutto lì dentro, ma se proprio vuoi una soluzione al tuo singolo caso ti consiglio di importare System.ComponentModel tra gli using della classe col tuo metodo, e lì dentro creare il metodo in questo modo:

public static void TuoMetodo(object sender, DoWorkEventArgs e)
{
....
}

Così puoi usarlo in DoWorkEventHandler(NomeClasse.TuoMetodo)


ReportProgress serve principalmente per rendere noto lo stato del processo in background ma, a differenza del motodo che riceve il DoWork, il metodo che riceve il ReportProgress può interagire direttamente con le variabili visibili a tutta la classe.

Mattyfog
23-03-2010, 15:30
semplicemente io ho un metodo che si trova in un altra classe che a sua volta si trova in un file diverso da quello del backuground worker

flx2000
23-03-2010, 16:47
Appunto, puoi fare come ti ho detto.

Mattyfog
23-03-2010, 20:30
La riga

backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(Gracenote.Search_by_Song_and_Artist(textBox_brano.Text, textBox_nomeartista.Text));

mi da l'errore di compilazione:
Occorre un riferimento a un oggetto per la proprietà, il metodo o il campo non statico
Il problema per caso è dato da textBox_brano.Text e textBox_nomeartista.Text?
Come risolvo??

flx2000
23-03-2010, 20:44
Invece di scrivere:

backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(Gracenote.Search_by_Song_and_Artist(textBox_brano.Text, textBox_nomeartista.Text));

Puoi scrivere:
String[] dati = new String[2] { textBox_brano.Text, textBox_nomeartista.Text };
backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(Gracenote.Search_by_Song_and_Artis);
backgroundWorker_gracenote.RunWorkerAsync(dati);

Ovviamente si presuppone che Gracenote.Search_by_Song_and_Artist sia un metodo fatto per ricevere una richiesta di tipo BackgroundWorker, e dovrai rivedere i parametri perché glieli passo come un unico array.

Mattyfog
23-03-2010, 20:49
Mmm credo di aver capito, grazie!
Quindi dovrà essere dichiarata così:

public static void Search_by_Song_and_Artist(object sender, DoWorkEventArgs e)
{
...
}

dove la variabile seder contiene l'array con dentro le variabili passate al metodo giusto?
e la seconda variabile, DoWorkEventArgs e a cosa serve?

flx2000
23-03-2010, 21:15
Mmm credo di aver capito, grazie!
Quindi dovrà essere dichiarata così:

public static void Search_by_Song_and_Artist(object sender, DoWorkEventArgs e)
{
...
}

dove la variabile seder contiene l'array con dentro le variabili passate al metodo giusto?
e la seconda variabile, DoWorkEventArgs e a cosa serve?

No, no! :D
Il sender è il background worker, mentre la e è il parametro.

Nel metodo puoi ricavare l'array così:

String[] dati = (String[])e.Argument;

Alla fine puoi dare un dato in uscita (che il backworker invia all'apposito metodo che grabba l'evento del work completed) impostando e.Result = risultato.

Mattyfog
24-03-2010, 15:17
E per far restituire dei valori al metodo DoWork? Non posso usare il return vero?

flx2000
24-03-2010, 15:25
E per far restituire dei valori al metodo DoWork? Non posso usare il return vero?

Te l'ho scritto: devi impostare e.Result = tuo_risultato;

L'evento work completed a cui devi associare il tuo background worker riceve automaticamente questo parametro senza bisogno di return.

Mattyfog
24-03-2010, 15:28
sarebbe e.Result = qualcosa a quanto pare :D
Comunque grazie! ;)
Senti invece

backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(Gracenote.Search_by_Song_and_Artist);

Da sempre errore!
Occorre un riferimento a un oggetto per la proprietà, il metodo o il campo non statico

EDIT: che noobs avevo dimenticato lo static nella dichiarazione della funzione

flx2000
25-03-2010, 00:26
[...]
EDIT: che noobs avevo dimenticato lo static nella dichiarazione della funzione

:D capita eheh

Mattyfog
25-03-2010, 17:56
Bom ora il background worker sembra andare peccato che ora devo lavorare con xml e non so una mazza..
Proverò meglio domani che ho tempo...

Grazie! :)