2016-04-13 20 views
1

Form dışında başka bir sınıftan bir yöntem çağıran bir BackgroundWorker iş parçacığı bir etiket güncelleştirmeye çalışıyorum. Bu yüzden bunu yapmak istiyorum:BackgroundWorker iş parçacığı WinForms UI güncelleştirmesi

Ancak etiket özeldir. BackgroundWorker'ın progressupdate işlevini kullanmak, çağırmak vb. Gibi şeylere baktım ama ihtiyaç duyduğum gibi görünmüyorlar. Burada

kodumu bazıları daha fazlasıdır:

MainForm:

clickThread.DoWork += (s, o) => { theClicker.Execute(speed); }; 
clickThread.RunWorkerAsync(); 

denilen Sınıf/Yöntem: Ben aşırı benim kod biraz karmaşık düşünüyorum

public void Execute(int speed) 
{ 
    while (running) 
    { 
     Thread.Sleep(speed); 
     Mouse.DoMouseClick(); 
     Counter++; 
     //Update UI here 
    } 
} 

: \ ve kendimi bir köşeye yedekledim.

+0

, bunu ayarlamak için bir yöntem veya özellik gösteririm? – Hendry

+0

Sorunu anlamak için: "TheClicker" nesnesinin MainForm'un özel etiketine erişimi yok, değil mi? Bu sorunu çözmenin gerçekten zayıf bir yolu, etiketi "TheClicker" ın Execute yöntemine iletmektir. – Shamshiel

+5

BW'nin temelleri, "DoWork" içinden basit UI'ye erişemez. "ProgressChanged" öğesindeki "DoWork" ve UI öğelerindeki kullanıcı arabirimi dışı öğeleri yapın. –

cevap

2

UI'yi güncellemek için ProgressChanged -Event kullanmalısınız. yöntemini çağırmak için

internal static void RunWorker() 
{ 
    int speed = 100; 
    BackgroundWorker clickThread = new BackgroundWorker 
    { 
     WorkerReportsProgress = true 
    }; 
    clickThread.DoWork += ClickThreadOnDoWork; 
    clickThread.ProgressChanged += ClickThreadOnProgressChanged; 
    clickThread.RunWorkerAsync(speed); 

} 

private static void ClickThreadOnProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 

    someLabel.Text = (string) e.UserState; 

} 

private static void ClickThreadOnDoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = (BackgroundWorker)sender; 
    int speed = (int) e.Argument; 

    while (!worker.CancellationPending) 
    { 
     Thread.Sleep(speed); 
     Mouse.DoMouseClick(); 
     Counter++; 
     worker.ReportProgress(0, "newText-Parameter"); 
    } 
} 

}

+1

BGW'nin tek doğru kullanımını kandıran? Görevleri kullanmanın daha iyi ve daha kolay olduğunu söyleyebiliriz, ancak bu, amaca uygun olarak geliştirilen ProgressChanged olayının kullanılmasının * yanlış * –

+0

sanırım bu çözümün en iyi ihtimalle olacağı anlamına gelmez. Sanırım kendimi, Execute yöntemi için ayrı bir sınıfa sahip olma fikrine evlenmeme izin verdim. Refactor ve çalışınca, bu cevabı kabul edeceğim. – James

+0

"someLabel.Text = (string) e.UserState;" yöntem statik olduğundan çalışmaz. – James

-3

Dene: BackgroundWorker için kod gibi görünmelidir. Örnek için

: - Etiket özel mi olduğunu

this.Invoke((Action)(() => Resources.xobjMF.Enabled = true)); 
İlgili konular