редактировать
Теперь, когда мы видим код, становится ясно, что это просто способ переместить некоторую инициализацию из Form_Load, но все же это произойдет до того, как пользователь сможет взаимодействовать с формой.
Вызов BeginInvoke
находится внутри Form_load и не вызывается для другого объекта, поэтому это вызов Form.BeginInvoke. Итак, что происходит, это.
- Form_Load передает делегата Form.BeginInvoke, это помещает сообщение в очередь сообщений формы, которая на впереди всех сообщений ввода пользователя. Он устанавливает курсор на курсор ожидания.
- Form_Load возвращается, и остальная часть инициализации формы может быть завершена, форма, скорее всего, станет видимой в этот момент.
- Как только код попадает в насос сообщений, первое, что он видит в очереди - это делегат, поэтому он запускает его.
- по завершении делегата, он меняет курсор на обычный курсор и возвращает
- прибыль!
оригинальный пост ниже
Я зависит от объекта, на который вы вызываете BeginInvoke. Если объект является производным от Control
, то Control.BeginInvoke будет выполняться в потоке, создавшем элемент управления. См. Ответ JaredPar.
Но есть и другая схема использования BeginInvoke. если объект является делегатом, то BeginInvoke запускает обратный вызов в отдельном потоке, который может быть создан специально для этой цели.
public class Foo
{
...
public Object Bar(object arg)
{
// this function will run on a separate thread.
}
}
...
// this delegate is used to Invoke Bar on Foo in separate thread, this must
// take the same arguments and return the same value as the Bar method of Foo
public delegate object FooBarCaller (object arg);
...
// call this on the main thread to invoke Foo.Bar on a background thread
//
public IAsyncResult BeginFooBar(AsyncCallback callback, object arg)
{
Foo foo = new Foo();
FooBarCaller caller = new FooBarCaller (foo.Bar);
return caller.BeginInvoke (arg);
}
Этот шаблон является одной из причин, по которой BeginInvoke вызывается из основного потока, а не из фонового потока.