Я іноді використовую (в Load)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
або
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(змінити "це" на змінну вашої форми, якщо ви обробляєте подію в екземплярі, відмінному від "цього").
Це натискає на виклик циклу вікон-форм, тому він обробляється, коли форма обробляє чергу повідомлень.
[оновлено на запит]
Методи Control.Invoke / Control.BeginInvoke призначені для використання з нарізкою різьби та є механізмом для поштовху роботи на потоці інтерфейсу користувача. Зазвичай для цього використовують робочі потоки тощо. Control.Invoke робить синхронний дзвінок, де-як Control.BeginInvoke робить асинхронний виклик.
Зазвичай вони використовуються як:
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;
});
}
Це робиться шляхом натискання повідомлення на чергу повідомлень Windows; потік користувальницького інтерфейсу (в якийсь момент) виводить з черги повідомлення, обробляє делегата та сигналізує працівникові, що воно завершено ... поки що добре ;-p
ГАРАЗД; так що станеться, якщо ми використовуємо Control.Invoke / Control.BeginInvoke на потоці інтерфейсу? Він справляється ... якщо ви зателефонуєте Control.Invoke, досить розумно знати, що блокування в черзі повідомлень призведе до негайного тупику - тому, якщо ви вже в потоці інтерфейсу, він просто запустить код негайно ... так що не допомагає нам ...
Але Control.BeginInvoke працює по-іншому: він завжди висуває роботу на чергу, навіть якщо ми вже є в потоці інтерфейсу. Це робить насправді простим способом сказати "за мить", але без незручностей таймерів тощо (що все одно доведеться робити те саме!).