yılında UI erişme benim iplik i in Konu UI erişmek yapmak nasıl System.Threading.ThreadAbortExceptioni UI özelliğini değiştirmek çalıştığınızda bir iplik
atar (özellikle etkinleştirmek).
yılında UI erişme benim iplik i in Konu UI erişmek yapmak nasıl System.Threading.ThreadAbortExceptioni UI özelliğini değiştirmek çalıştığınızda bir iplik
atar (özellikle etkinleştirmek).
Bir BackgroundWorker kullanabilir ve sonra böyle UI değişebilir: C# 3.5 kullanıyorsanız
control.Invoke((MethodInvoker)delegate {
control.Enabled = true;
});
El ile thead synchronization implemenation yerine Win Form'un BackgroundWorker sınıfını kullanma hakkında nasıl?
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).
Başlatma özelliğine geri döndürme isteğinde bulunmadıkça, çoğu durumda BeginInvoke() yöntemini de güvenle kullanabilirsiniz. – Quibblesome
'InvokeRequired/BeginInvoke' çok bozuk, IMO. –
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.
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();
}
}
, 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");
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
En az miktarda metin kullanmak ve en net örneği/açıklaması göstermek için kazanırsınız. Kudos –
Zamanımı kurtarmanın en kolay yolu. – Tirth