SynchronizationContext memberi kami cara untuk memperbarui UI dari utas yang berbeda (secara sinkron melalui metode Kirim atau secara tidak sinkron melalui metode Posting).
Lihatlah contoh berikut:
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 akan mengembalikan konteks sinkronisasi utas UI. Bagaimana saya tahu ini? Di awal setiap formulir atau aplikasi WPF, konteksnya akan ditetapkan pada utas UI. Jika Anda membuat aplikasi WPF dan menjalankan contoh saya, Anda akan melihat bahwa ketika Anda mengklik tombol, itu tidur selama sekitar 1 detik, maka itu akan menampilkan konten file. Anda mungkin berharap itu tidak akan terjadi karena pemanggil metode UpdateTextBox (yang merupakan Work1) adalah metode yang diteruskan ke Thread, oleh karena itu ia harus menggunakan utas tersebut bukan utas UI utama, NOPE! Meskipun metode Work1 diteruskan ke utas, perhatikan bahwa ia juga menerima objek yang merupakan SyncContext. Jika Anda melihatnya, Anda akan melihat bahwa metode UpdateTextBox dijalankan melalui metode syncContext.Post dan bukan metode Work1. Lihatlah yang berikut ini:
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread.Sleep(1000);
string text = File.ReadAllText(@"c:\temp\log.txt");
myTextBox.Text = text;
}
Contoh terakhir dan yang ini menjalankan hal yang sama. Keduanya tidak memblokir UI saat itu berfungsi.
Sebagai kesimpulan, pikirkan SynchronizationContext sebagai utas. Ini bukan utas, ini menentukan utas (Perhatikan bahwa tidak semua utas memiliki SyncContext). Setiap kali kita memanggil metode Posting atau Kirim untuk memperbarui UI, itu seperti memperbarui UI secara normal dari utas UI utama. Jika, karena alasan tertentu, Anda perlu memperbarui UI dari utas yang berbeda, pastikan utas itu memiliki SyncContext utas utama UI dan panggil metode Kirim atau Posting di atasnya dengan metode yang ingin Anda jalankan dan Anda semua set.
Semoga ini bisa membantu Anda, sobat!