VB.NET 2010, .NET 4VB.NET Genel çapraz iş parçacıklı işlemlere iki farklı yaklaşım; Hangisi daha iyi?
Merhaba,
Son zamanlarda bazı kodlar için yürütme iş parçacığını denetlemek için SynchronizationContext
nesneleri kullanma hakkında okudum. Xzx65 kullanan UI denetimlerini güncelleştirme gibi şeyler için çapraz iş çağrıları (muhtemelen) işlemek için genel bir alt yordamı kullanıyorum. Ben amatörüm ve belirli bir yaklaşımın artılarını ve eksilerini anlamakta zorlanıyorum. Hangi yaklaşımın tercih edilebileceğine ve neden tercih edileceğine dair bir anlayış arıyorum.
Güncelleme: Bu soru kısmen MSDN page on Control.InvokeRequired
adresinden gelenler gibi ifadelerle motive edilmiştir.
Daha da iyi bir çözüm,
SynchronizationContext
tarafından döndürülenSynchronizationContext
'ı çapraz-iplikli sıralama için bir kontrolünden ziyade kullanmaktır.
Ayrıca, etrafa baktığımda, SO üzerinde bu tür bir soruna ilişkin soruların cevaplarının çoğunun neden bu yöntemi belirtmeden Invoke
yaklaşımını önerdiğine dair genel karışıklık.
Public Sub InvokeControl(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T))
If Control.InvokeRequired Then
Control.Invoke(New Action(Of T, Action(Of T))(AddressOf InvokeControl), New Object() {Control, Action})
Else
Action(Control)
End If
End Sub
Yöntem 2:
Public Sub UIAction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of Control))
SyncContext.Send(New Threading.SendOrPostCallback(Sub() Action(Control)), Nothing)
End Sub
Burada SyncContext
, UI formumun yapıcısında tanımlanmış bir Threading.SynchronizationContext
nesnesidir (bir modülde saklıyorum ... Emin değilim Eğer en iyi seçenek buysa):
Public Sub New()
InitializeComponent()
SyncContext = WindowsFormsSynchronizationContext.Current
End Sub
Daha sonra, UI formundaki bir denetimi (örn. Label1
) güncellemek isteseydim:
InvokeControl(Label1, Sub(x) x.Text = "hello")
veya
UIAction(Label1, Sub(x) x.Text = "hello")
Peki, sen ne düşünüyorsun? Bir yol tercih edilir mi yoksa içeriğe mi bağlı? Zamanınız varsa, ayrılık takdir edilecektir!
Şimdiden teşekkürler,
Brian