|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
[C#]Background Worker
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: Codice:
backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(nome della funzione); |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
Nada?
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
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 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
Ok e se non è accessibile (perchè si trova in un altro file) per renderla tale devo scrivere
Codice:
new nomeclasse nomevariabile = news nomeclasse(); Ma reportprogress non serve solo per sapere a che punto è "il lavoro"? |
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
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. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
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
|
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
Appunto, puoi fare come ti ho detto.
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
La riga
Codice:
backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(Gracenote.Search_by_Song_and_Artist(textBox_brano.Text, textBox_nomeartista.Text)); 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?? |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
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. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
Mmm credo di aver capito, grazie!
Quindi dovrà essere dichiarata così: Codice:
public static void Search_by_Song_and_Artist(object sender, DoWorkEventArgs e) { ... } e la seconda variabile, DoWorkEventArgs e a cosa serve? |
![]() |
![]() |
![]() |
#11 | |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
Quote:
![]() 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. |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
E per far restituire dei valori al metodo DoWork? Non posso usare il return vero?
|
![]() |
![]() |
![]() |
#13 | |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
Quote:
L'evento work completed a cui devi associare il tuo background worker riceve automaticamente questo parametro senza bisogno di return. |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
sarebbe e.Result = qualcosa a quanto pare
![]() Comunque grazie! ![]() Senti invece Codice:
backgroundWorker_gracenote.DoWork += new DoWorkEventHandler(Gracenote.Search_by_Song_and_Artist); 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 Ultima modifica di Mattyfog : 24-03-2010 alle 20:03. |
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Nov 2002
Città: Roma
Messaggi: 810
|
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jul 2008
Messaggi: 1426
|
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! ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:18.