Saya terkadang menggunakan (di Load)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
atau
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(ubah "ini" ke variabel formulir Anda jika Anda menangani peristiwa pada instance selain "ini").
Ini mendorong pemanggilan ke loop bentuk jendela, sehingga diproses saat formulir memproses antrian pesan.
[diperbarui berdasarkan permintaan]
Metode Control.Invoke / Control.BeginInvoke dimaksudkan untuk digunakan dengan threading, dan merupakan mekanisme untuk mendorong pekerjaan ke thread UI. Biasanya ini digunakan oleh utas pekerja dll. Control.Invoke melakukan panggilan sinkron, di mana-karena Control.BeginInvoke melakukan panggilan asinkron.
Biasanya, ini akan digunakan sebagai:
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;
});
}
Ini dilakukan dengan mendorong pesan ke antrian pesan windows; UI thread (di beberapa titik) membatalkan antrian pesan, memproses delegasi, dan memberi sinyal kepada pekerja bahwa itu telah diselesaikan ... sejauh ini sangat bagus ;-p
BAIK; jadi apa yang terjadi jika kita menggunakan Control.Invoke / Control.BeginInvoke pada UI thread? Ini mengatasi ... jika Anda memanggil Control.Invoke, cukup masuk akal untuk mengetahui bahwa pemblokiran pada antrian pesan akan menyebabkan kebuntuan langsung - jadi jika Anda sudah berada di thread UI, kode akan langsung menjalankannya ... tidak membantu kami ...
Tetapi Control.BeginInvoke bekerja secara berbeda: ia selalu mendorong pekerjaan ke antrian, meskipun kita sudah berada di thread UI. Ini membuat cara yang sangat sederhana untuk mengatakan "dalam sekejap", tetapi tanpa ketidaknyamanan pengatur waktu dll (yang tetap harus melakukan hal yang sama!).