2011-09-07 24 views
8

Entiendo cómo podemos pasar una variable (progresspercentage) a la función "progresschanged", como tal.Cómo enviar más argumentos en C# backgroundworker progressed changed event

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

...

worker.ReportProgress(pc); 

...

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

Pero quiero pasar más variables a esta función, algo como:

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 
} 

sorry Soy nuevo en C#, podría alguien darme un ejemplo.

Respuesta

16

El método ReportProgress de fondo componente trabajador está sobrecargado para pasar porcentaje y un valor de estado mecanografiado objeto:

public void ReportProgress(int percentProgress, Object userState) 

En su requerimiento uso puede concatenar el nombre del usuario y el marcador con un separador de carbón, y así pasar el valores múltiples dentro del parámetro userState; y dividirlos dentro del evento ProgressChanged() cuando se genera. También puede crear una pequeña clase basada en propiedades, llenarlo con valores y pasar usando el parámetro userState de tipo de objeto.

Para un ejemplo de muestra de cómo usar el método ReportProgress sobrecargada, por favor mirar el siguiente MSDN enlace:

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

7

crear un objeto de la transferencia de datos con propiedades en los artículos que desea pasar y y luego pásalo como el estado del usuario. En el mundo de OO, la respuesta casi siempre es crear otro objeto.

12

En caso de que alguien está buscando una respuesta completa:

  1. enfoque rápido y simple sería:

    worker.ReportProgress(i, new object[] { pc, username, score }); 
    
  2. enfoque de tipo seguro sería:

    worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score)); 
    
  3. es posible que desee derivar sus tipos genéricos personalizados de System.Tuple.

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

    tener algo más simple como:

    worker.ReportProgress(i, new PcUsernameScore(pc, username, score)); 
    
  4. Gracias a Eric 's comentario también se puede pasar a una clase personalizada o estructura en lugar de una tupla

p.ej

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

parece una buena idea, pero por alguna razón no pude conseguir el ejemplo 3 para trabajar (la derivación de una clase personalizada de System.Tuple) utilizando .NET Framework versión 4/MS Visual Studio 2010 Professional. La definición de clase PcUsernameScore da "error CS1729: 'System.Tuple ' no contiene un constructor que toma 0 argumentos", y la llamada ReportProgress del trabajador da el "error CS1729: 'myclass.PcUsernameScore 'no contiene un constructor que toma 3 argumentos'. Pero su ejemplo 2 funciona bien. – MarkU

+0

@MarkU lo tienes bien, actualicé la respuesta. – Bijan

+2

también podría pasar una clase o estructura personalizada en lugar de una tupla – Eric