Вы имеете в виду Delegate.Invoke/BeginInvoke или Control.Invoke/BeginInvoke?
- Delegate.Invoke: Выполняется синхронно, в той же теме.
- Делегат.BeginInvoke: Выполняется асинхронно, в потоке threadpool.
- Control.Invoke: Выполняется в потоке пользовательского интерфейса, но вызов продолжается до завершения.
- Control.BeginInvoke: Выполняется в потоке пользовательского интерфейса, а вызывающий поток не ждет завершения.
Ответ Тима упоминается, когда вы, возможно, захотите использовать BeginInvoke - хотя это было в основном связано с делегатом.BeginInvoke, я подозреваю.
Для приложений Windows Forms я бы предположил, что вы должны обычно использовать BeginInvoke. Таким образом, вам не нужно беспокоиться о тупике, например, но вам нужно понять, что пользовательский интерфейс, возможно, не был обновлен к тому времени, когда вы его посмотрите на него! В частности, вы не должны изменять данные, которые может использоваться для отображения в пользовательском интерфейсе. Например, если у вас есть человек с FirstName и LastName свойствами, и вы сделали:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
то интерфейс может хорошо закончить показ «Кайзер Спейси». (Есть вероятность, что он может отобразить «Кевин Соз», но только через странность модели памяти.)
Если у вас есть такая проблема, однако Control.BeginInvoke легче получить право и будет избегать ваших фоновый поток от необходимости ждать веской причины. Обратите внимание, что команда Windows Forms гарантировала, что вы можете использовать Control.BeginInvoke в режиме «огонь и забухание», т. Е. Без вызова EndInvoke. Это не относится к асинхронным вызовам вообще: обычно каждый BeginXXX должен иметь соответствующий вызов EndXXX, обычно в обратном вызове.
Тогда зачем использовать ppl Invoke over BeingInvoke? Не должно быть преимуществ перед использованием Invoke. Оба выполняют процессы в фоновом режиме, только один из них находится в одном потоке, а другой - в другом потоке? – yeeen 2010-10-08 09:23:19