Arka plan başlığında ana arayüzün nasıl güncelleneceğine dair birçok giriş makalesi okudum ve çoğu Control.Invoke ve Control.BeginInvoke kullanıyor. Bunlar iyi çözümler, ancak iki sorun var:
1. System.Windows.Forms adresine başvurmalı ve ardından System.Windows.Forms kullanmalısınız
2. Kod yapısı nispeten karmaşık. (Aslında, bu da #1 tarafından sebep oluyor)
Microsoft, daha şık bir çözüm daha sunar: System.Threading. SynchronizationContext。 Gördüğünüz gibi, namesapce System.Windows.Forms içinde yok, bu yüzden BusinessLaryer, Controler ve hatta modüllerde haklı olarak kullanabiliriz.
Ve kullanımı çok kolay, sadece aşağıdaki iki yönteme odaklanmanız yeterlidir:
1. Gönder: Ana iş parçacığına arayüz güncelleme talebi gönderir, mevcut iş parçacığı geri dönene kadar engeller.
2. Post: Mevcut iş parçacığı engellemeden ana iş parçacığına arayüz güncelleme talebi gönderir.
Aslında, hepsi aynı yöntemdir, ancak gönderme senkron, posta ise asenkron
Form1 form = yeni Form1() öncesinde SynchronizationContext nesnesi boştu ve Form1 formu oluşturulduğunda, SynchronizationContext nesnesi bu iş parçacığına ekleniyordu. Yani cevap şu ki, Control nesnesi oluşturulduğunda, SynchronizationContext nesnesi de oluşturulur ve iş parçacığına bağlanır. Tüm bunlar InitializeComponent() formu kullanılırken; Bu yapıldıktan sonra, NULL olmayan bir nesne elde edebilir
Son olarak, SenkronizasyonBağlam'ın Sendt() ve Post() yöntemleri arasındaki fark:
Send(), mevcut iş parçacığındaki delegeyi (senkron çağrı) çağırarak uygulanır. Yani, UI iş parçacığı doğrudan alt iş parçacığında çalıştırılması çağrılır ve alt iş parçacığı UI iş parçacığı çalıştırılması tamamlandıktan sonra da çalışmaya devam eder.
Post(), iş parçacığı havuzunda bir delege çağrısı ile uygulanır (asenkron çağrı). Bunun nedeni, alt iş parçacığı ipliği havuzundan bir iş parçacığı bulup, arayüz iş parçacığını ayarlamak için bir iş parçacığını bulması ve alt iplik, arayüz iş parçacığı tamamlanmasını beklemeden doğrudan kendi kodunu çalıştırmasıdır. Test kodu:
Sonuç:
UI ana konu: 1 Konu: 5 SynchContext:1
Özet:UI iş parçacığındaki SynchronizationContext nesnesi, ana iş parçacığında mı çağrılsın, ana iş parçacığında çalıştırılır, bu yüzden çok zaman alan kod olduğunda arayüz arayüzünün donmasına veya sahte ölümüne neden olur!
AslındaUI iş parçacığı SynchronizationContext sınıfını değil, WindowsFormsSynchronizationContext kullanırBu Dongdong.
System.Threading.SynchronizationContext kaynak kodu:
WindowsFormsSynchronizationContext source code:
|