Bazen kullanıyorum (Yükte)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
veya
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(Olayı "this" dışında bir örnekte işliyorsanız "this" i form değişkeninize değiştirin).
Bu, çağrıyı windows-form döngüsüne iter, böylece form ileti kuyruğunu işlerken işlenir.
[istek üzerine güncellenir]
Control.Invoke / Control.BeginInvoke yöntemleri, iş parçacığı ile kullanılmak üzere tasarlanmıştır ve işi UI iş parçacığına itmek için bir mekanizmadır. Normalde bu işçi iş parçacıkları vb. Tarafından kullanılır. Control.Invoke zaman uyumlu bir çağrı yapar, burada Control.BeginInvoke zaman uyumsuz bir çağrı yapar.
Normalde bunlar şu şekilde kullanılır:
SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call
// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}
Bunu, Windows ileti kuyruğuna bir ileti göndererek yapar; UI iş parçacığı (bir noktada) mesajı sıradan çıkarır, temsilciyi işler ve işçiye tamamladığı sinyalini verir ... şimdiye kadar çok iyi ;-p
TAMAM; öyleyse UI iş parçacığında Control.Invoke / Control.BeginInvoke kullanırsak ne olur? Eğer Control.Invoke'u çağırırsanız, mesaj kuyruğundaki engellemenin anında bir kilitlenmeye neden olacağını bilmek yeterince mantıklıdır - bu nedenle, zaten UI iş parçacığındaysanız, kodu hemen çalıştırır ... böylece bize yardım etmiyor ...
Ancak Control.BeginInvoke farklı çalışır: zaten UI iş parçacığında olsak bile işi her zaman kuyruğa iter. Bu, "bir anda" demenin gerçekten basit bir yolunu yapar, ancak zamanlayıcıların vb. Rahatsızlığı olmadan (ki yine de aynı şeyi yapmak zorunda kalır!).