2011-09-07 4 views
8

Bir değişkeni (progresspercentage) "progresschanged" işlevine nasıl iletebileceğimizi anlıyorum.C# backgroundworker'da daha fazla argüman nasıl gönderilir değiştirildi etkinlik değiştirildi

worker.ReportProgress(pc,username,score); 

:

backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged); 

...

worker.ReportProgress(pc); 

...

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

Ama bu işlev, bazı şey gibi daha fazla değişken geçmek istiyorum. ..

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 
} 

özür dilerim C# için yeni, birisi bana bir örnek verebilir. Eğer UserName bitiştirmek ve bir karakter ayırıcı ile Skoru ve böylece geçebilir

public void ReportProgress(int percentProgress, Object userState) 

, kullanım gereksinimi içinde:

cevap

16

arka plan işçi bileşeninin ReportProgress yöntemi yüzdesini ve bir nesne yazılan devlet değerini geçmesine aşırı yüklü userState parametresinde birden çok değer; ve yükseltildiğinde bunları ProgressChanged() olayına bölmek. Ayrıca, küçük bir özellik tabanlı sınıf oluşturabilir - değerlerle doldurup userState nesnesiyle yazılan parametreyi kullanarak iletebilirsiniz.

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

7

geçmek istediğiniz öğeleri ve ve için özelliklere sahip bir veri aktarım nesnesi oluşturun: aşırı ReportProgress yöntemini nasıl kullanılacağına ilişkin bir örnek Örneğin

, MSDN linki aşağıda bakmak lütfen sonra kullanıcı durumu olarak geçirin. OO dünyasında, cevap neredeyse her zaman başka bir nesne yaratmaktır.

12

durumda herkes kapsamlı bir cevap arıyor:

  1. Hızlı ve basit bir yaklaşım olur:

    worker.ReportProgress(i, new object[] { pc, username, score }); 
    
  2. Tip güvenli yaklaşım olacaktır:

    worker.ReportProgress(i, new System.Tuple<object, string, float>(pc, username, score)); 
    
  3. numaralı özel çok jenerik türlerinizi türetmek isteyebilirsiniz System.Tuple Ayrıca özel bir sınıf geçmesi veya yapı yerine tuplea

ait olabilir

worker.ReportProgress(i, new PcUsernameScore(pc, username, score)); 
  • Teşekkür comment Eric 'ler için:

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

    gibi daha basit bir şey var Örneğin

    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

    iyi bir fikir gibi görünüyor, ama nedense ben .NET Framework sürüm 4/MS Visual Studio 2010 Professional kullanarak (System.Tuple gelen özel bir sınıf türetmek) çalışmaya örnek 3 alamadım. PcUsernameScore sınıfının tanımı "error CS1729:" System.Tuple ', 0 argümanını alan bir kurucu içermiyor ", ve worker ReportProgress çağrısı veriyor" error CS1729:' myclass.PcUsernameScore '3 argüman alan bir kurucu içermez'. Ama örnek 2'niz Tamam çalışıyor. – MarkU

    +0

    @MarkU haklısınız, cevabı güncelledim. – Bijan

    +2

    ayrıca bir tuple yerine özel bir sınıf veya struct geçirebilirsiniz – Eric