SynchronizationContext, bir UI'yi farklı bir iş parçacığından güncellememiz için bir yol sağlar (Send yöntemi aracılığıyla eşzamanlı olarak veya Post yöntemi aracılığıyla eşzamansız olarak).
Aşağıdaki örneğe bir göz atın:
private void SynchronizationContext SyncContext = SynchronizationContext.Current;
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(Work1);
thread.Start(SyncContext);
}
private void Work1(object state)
{
SynchronizationContext syncContext = state as SynchronizationContext;
syncContext.Post(UpdateTextBox, syncContext);
}
private void UpdateTextBox(object state)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
SynchronizationContext.Current, UI iş parçacığının eşitleme bağlamını döndürür. Bunu nasıl bilebilirim? Her formun veya WPF uygulamasının başlangıcında, bağlam, UI iş parçacığında ayarlanacaktır. Bir WPF uygulaması oluşturur ve örneğimi çalıştırırsanız, düğmeyi tıkladığınızda yaklaşık 1 saniye uyuduğunu ve ardından dosyanın içeriğini göstereceğini göreceksiniz. UpdateTextBox yöntemini çağıran (Work1 olan) bir Thread'a geçirilen bir metot olduğundan, bunun olmayacağını bekleyebilirsiniz, bu nedenle ana UI iş parçacığı, NOPE değil, o iş parçacığı uyumalıdır! Work1 yöntemi bir iş parçacığına aktarılsa da, SyncContext olan bir nesneyi de kabul ettiğine dikkat edin. Buna bakarsanız, UpdateTextBox yönteminin Work1 yöntemi değil syncContext.Post yöntemi ile yürütüldüğünü göreceksiniz. Aşağıdakilere bir göz atın:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
Son örnek ve bu aynı şeyi gerçekleştiriyor. Her ikisi de işleri yaparken kullanıcı arayüzünü engellemez.
Sonuç olarak, SynchronizationContext'i bir iş parçacığı olarak düşünün. Bu bir iş parçacığı değil, bir iş parçacığı tanımlar (Tüm iş parçacığı bir SyncContext'e sahip değildir). Bir kullanıcı arayüzünü güncellemek için üzerinde Gönder veya Gönder yöntemini her çağırdığımızda, bu, kullanıcı arayüzünü normalde ana UI iş parçacığından güncellemek gibidir. Bazı nedenlerden dolayı, UI'yi farklı bir iş parçacığından güncellemeniz gerekiyorsa, iş parçacığının ana UI iş parçacığının SyncContext'e sahip olduğundan emin olun ve yürütmek istediğiniz yöntemle üzerinde Gönder veya Gönder yöntemini çağırın ve hepiniz Ayarlamak.
Umarım bu sana yardımcı olur dostum!