2011-09-07 7 views
8

Capisco come possiamo passare una funzione variabile (progresspercentage) a "progresschanged", in questo modo.Come inviare più argomenti in C# backgroundworker è stato modificato l'evento

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

...

worker.ReportProgress(pc); 

...

private void backgroundWorker1_ProgressChanged(object sender, 
ProgressChangedEventArgs e) 
{ 
    this.progressBar1.Value = e.ProgressPercentage; 
} 

ma voglio passare più variabili a questa funzione, qualche cosa come:

worker.ReportProgress(pc,username,score); 

. ..

private void backgroundWorker1_ProgressChanged(object sender, 
ProgressChangedEventArgs e) 
{ 
    this.progressBar1.Value = e.ProgressPercentage; 
    this.currentUser.Value = e.UserName; //as string 
    this.score.Value = e.UserScore; //as int 
} 

scusa sono nuovo di C#, qualcuno potrebbe darmi un esempio.

risposta

16

Il metodo ReportProgress sfondo componente lavoratore è sovraccaricato di passare percentuale e un oggetto tipizzato valore di stato:

public void ReportProgress(int percentProgress, Object userState) 

Nella vostra esigenza d'uso è possibile concatenare UserName e punteggio con un separatore char, e quindi passare il più valori all'interno del parametro userState; e dividerli all'interno dell'evento ProgressChanged() quando viene generato. È anche possibile creare una piccola classe basata sulla proprietà - riempirla con valori e passare usando il parametro digitato oggetto userState.

Per un esempio di esempio di come utilizzare il metodo ReportProgress sovraccarico, si prega di guardare al di sotto MSDN link:

http://msdn.microsoft.com/en-us/library/a3zbdb1t.aspx

7

Creare un oggetto di trasferimento dati con le proprietà per gli elementi che si desidera passare e e quindi passarlo come stato utente. Nel mondo OO, la risposta è quasi sempre quella di creare un altro oggetto.

12

Nel caso qualcuno è alla ricerca di una risposta esauriente:

  1. approccio veloce e semplice potrebbe essere:

    worker.ReportProgress(i, new object[] { pc, username, score }); 
    
  2. approccio Type-safe sarebbe:

    worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score)); 
    
  3. potresti voler derivare i tuoi tipi multi-generici personalizzati da System.Tuple.

    public class PcUsernameScore : System.Tuple<object, string, float> 
    { 
        public PcUsernameScore(object p1, string p2, float p3) 
         : base(p1, p2, p3) 
        { 
        } 
    } 
    

    per avere qualcosa di più semplice come:

    worker.ReportProgress(i, new PcUsernameScore(pc, username, score)); 
    
  4. Grazie alla Eric 's commento si potrebbe anche passare una classe personalizzata o una struttura invece di una tupla

per esempio

public class PcUsernameScore 
{ 
    public object PC; 
    public string UserName; 
    public float Score; 
    public PcUsernameScore(object pc, string username, float score) 
    { 
     PC = pc; Username = username; Score = score; 
    } 
} 
worker.ReportProgress(i, new PcUsernameScore(pc, username, score)); 
+0

sembra una buona idea, ma per qualche motivo non ho potuto ottenere ad esempio da 3 a lavorare (derivazione di una classe personalizzata da System.Tuple) utilizzando .NET Framework versione 4/MS Visual Studio 2010 Professional. La definizione di classe PcUsernameScore restituisce "errore CS1729: 'System.Tuple ' non contiene un costruttore che accetta 0 argomenti", e la chiamata di ReportProgress worker restituisce "errore CS1729: 'myclass.PcUsernameScore 'non contiene un costruttore che accetta 3 argomenti ". Ma il tuo esempio 2 funziona correttamente. – MarkU

+0

@MarkU hai capito bene, ho aggiornato la risposta. – Bijan

+2

potresti anche passare una classe personalizzata o una struct invece di una tupla – Eric

Problemi correlati