Разница между различными способами вызова делегата - PullRequest
1 голос
/ 08 октября 2010

В чем разница между следующим?

public delegate void SetSthDelegate(int[] x);

// 1)
SetSthDelegate sst = new SetSthDelegate(SetSthMethod);
sst(x);

// 2)
Invoke(new SetSthDelegate(SetSthMethod), new object[] {x}

// 3)
BeginInvoke(new SetSthDelegate(SetSthMethod), new object[] {x}

Я узнал, что 2) для синхронного вызова методов, а 3) для асинхронного вызова методов, но когда вы хотите вызывать методы синхронно и асинхронно?

Может ли кто-нибудь показать мне, когда иллюстрация и объяснение, когда использовать 1), 2), 3) более уместна?

Может также объяснить, почему люди предпочитают Invoke, а не InInkeke и наоборот?

Ответы [ 3 ]

0 голосов
/ 08 октября 2010

Основная причина использования BeginInvoke заключается в том, что операция займет много времени. Тогда вы, вероятно, не хотите блокировать призывателя и просто получать уведомление, когда он закончится. Это добавляет сложности к коду, так что вы, вероятно, не захотите делать это, если вам это не нужно.

Если операция выполняется быстро, вы, вероятно, не хотите усложнять код асинхронными вызовами. Кроме того, если эта операция действительно требует, чтобы вызывающая сторона ожидала ответа, синхронность может быть такой же хорошей. Все зависит ...

0 голосов
/ 12 октября 2010
  • вызов аналогичен обычному вызову метода.
  • BeginInvoke () или вызов asunc - это просто вызов, затем переход. Вы не хотите ждать, пока работа будет сделана, или это медленная работа и нет необходимости ждать 1) и 2) это одно и то же. но 3) асинхронный вызов

в моем приложении, когда я хочу отправить письмо или зарегистрировать что-либо, я использую BeginInvoke, потому что ждать не обязательно

0 голосов
/ 08 октября 2010

номер 1) и 2) одинаковы. Они вызывают делегата синхронно. Номер 3), как вы сказали, вызывает его асинхронно. Вы хотите выполнить делегат асинхронно в тех случаях, когда вы не хотите блокировать ваш поток и дождаться окончания выполнения кода делегата. Используя beginInvoke, делегат выполняется в фоновом потоке, а ваш основной поток продолжает что-то выполнять.

Вот подробное объяснение: http://blogs.msdn.com/b/thottams/archive/2007/11/01/calling-delegates-using-begininvoke-invoke-dynamicinvoke-and-delegate.aspx

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...