2009-04-02 12 views

cevap

15

Bir BackgroundWorker kullanabilir ve sonra böyle UI değişebilir: C# 3.5 kullanıyorsanız

control.Invoke((MethodInvoker)delegate { 
    control.Enabled = true; 
}); 
+0

Kesinlikle karşılaştığım en kolay yol ve çok sayıda kullanıcı arayüzü güncelleme iş parçacığı denedim. Benim oy hakkım var. – GONeale

+0

En az miktarda metin kullanmak ve en net örneği/açıklaması göstermek için kazanırsınız. Kudos –

+0

Zamanımı kurtarmanın en kolay yolu. – Tirth

1

El ile thead synchronization implemenation yerine Win Form'un BackgroundWorker sınıfını kullanma hakkında nasıl?

3

WinForms’ten konuştuğumuzu mu düşünüyorsun? Bunu yöneten tek bir iş parçacığına sahip olmanız gerekir - söz konusu denetimi oluşturan iş parçacığı. Bunu, Control.InvokeRequired kullanarak algılayabileceğiniz farklı bir iş parçacığından yapmak isterseniz, bu işlemi doğru iş parçacığına dönüştürmek için Control.Invoke yöntemini kullanmalısınız. Google bunu yaparken bazı ortak modeller için bu özelliği ve yöntemi (sırasıyla).

+0

Başlatma özelliğine geri döndürme isteğinde bulunmadıkça, çoğu durumda BeginInvoke() yöntemini de güvenle kullanabilirsiniz. – Quibblesome

+0

'InvokeRequired/BeginInvoke' çok bozuk, IMO. –

1

UI iş parçacığı hala çalışırken, UI'yi değiştirmek istiyorsanız, UI iş parçacığına yapılan çağrıları yönetmek için SynchronizationContext'u kullanın. Aksi halde, BackgroundWorker kullanın.

1
void button1_Click(object sender, EventArgs e) { 
    var thread = new Thread(ParalelMethod); 
    thread.Start("hello world"); 
} 
void ParalelMethod(object arg) { 
    if (this.InvokeRequired) { 
     Action<object> dlg = ParalelMethod; 
     this.Invoke(dlg, arg); 
    } 
    else { 
     this.button1.Text = arg.ToString(); 
    } 
} 
6

, ondan UI güncelleme önlemek için uzatma yöntemleri ve lambdas kullanımı gerçekten çok kolay diğer konular.

public static class FormExtensions 
{ 
    public static void InvokeEx<T>(this T @this, Action<T> action) where T : Form 
    { 
    if (@this.InvokeRequired) 
    { 
     @this.Invoke(action, @this); 
    } 
    else 
    { 
     action(@this); 
    } 
    } 
} 

Yani şimdi herhangi bir biçimde üzerinde InvokeEx kullanmak ve herhangi özelliklerini Form parçası olmayan/alanlar erişmek mümkün olabilir.

this.InvokeEx(f => f.label1.Text = "Hello"); 
İlgili konular