2011-09-07 11 views
8

Rozumiem, jak możemy przekazać jedną zmienną (progresspercentage) do funkcji "progresschanged", tak jak to.Jak wysłać więcej argumentów w C# backgroundworker progresywnie zmieniono zdarzenie

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

...

worker.ReportProgress(pc); 

...

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

Ale chcę przekazać więcej zmiennych do tej funkcji, niektóre rzeczy takie jak:

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 
} 

Przepraszam Jestem nowy dla C#, czy ktoś mógłby dać mi przykład.

Odpowiedz

16

Sposób ReportProgress składnika tle Pracownik jest przeciążony przekazać procent i obiekt wpisany wartość Stan:

public void ReportProgress(int percentProgress, Object userState) 

w Twoim obowiązku użytkowania można złączyć nazwę użytkownika i nik z separatorem char, a więc przekazać wiele wartości w parametrze userState; i podzielić je wewnątrz zdarzenia ProgressChanged(), gdy zostanie podniesione. Można również utworzyć małą klasę opartą na właściwościach - wypełnij ją wartościami i przekaż przy użyciu parametru typowego obiektu userState.

dla próbki przykład jak używać przeciążonej metody ReportProgress, proszę spojrzeć na poniższy MSDN link:

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

7

utworzenia obiektu transferu danych z właściwości dla elementów, które chcesz przekazać i i następnie przekazać go jako stan użytkownika. W świecie OO odpowiedzią jest prawie zawsze stworzenie innego obiektu.

12

W przypadku ktoś szuka wyczerpującą odpowiedź:

  1. Szybkie i proste podejście byłoby:

    worker.ReportProgress(i, new object[] { pc, username, score }); 
    
  2. typu bezpieczne podejście byłoby:

    worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score)); 
    
  3. możesz chcieć wyprowadzić niestandardowe rodzaje generyczne z System.Tuple.

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

    mieć coś bardziej prostego jak:

    worker.ReportProgress(i, new PcUsernameScore(pc, username, score)); 
    
  4. Dzięki Eric „s komentarz można również przekazać niestandardowej klasy lub struct zamiast krotki

na przykład

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

Wydaje się, że to dobry pomysł, ale z jakiegoś powodu nie mogłem uzyskać przykładu 3 do pracy (wywodzącego się z klasy niestandardowej z System.Tuple) przy użyciu .NET Framework wersja 4/MS Visual Studio 2010 Professional. Definicja klasy PcUsernameScore podaje "błąd CS1729:" System.Tuple "nie zawiera konstruktora, który przyjmuje 0 argumentów", , a wywołanie funkcji ReportProgress daje komunikat "error CS1729: 'myclass.PcUsernameScore "nie zawiera konstruktora, który pobiera 3 argumenty". Ale twój przykład 2 działa OK. – MarkU

+0

@MarkU masz rację, zaktualizowałem odpowiedź. – Bijan

+2

można również przekazać niestandardową klasę lub strukturę zamiast krotki – Eric

Powiązane problemy