почему нам нужен EndInvoke () для возврата значения асинхронного вызова в делегате?

У меня возникли проблемы с пониманием того, что метод BeginInvoke() вызывает делегат при асинхронном вызове методов, после завершения его задач, почему сам BeginInvoke() не может вернуть возвращаемое значение из метода, почему нам требуется EndInvoke() для запроса BeginInvoke() и возврата возвращаемого значения из него. я знаю, что это может быть не хороший вопрос, но мое замешательство реально: -)

дополнение: я могу вызвать метод асинхронно, используя DelagateName.BeginInvoke (parameters), теперь, когда метод сопоставления в делегате(предположим, что он возвращает значение) завершает свою работу и возвращает значение, почему мне нужно DelegateName.EndInvoke (), чтобы получить возвращаемое значение? почему сам первый вызов не может возвращать значение при завершении метода.

2 ответов


, когда BeginInvoke возвращает, метод не завершен - в этом весь смысл его асинхронности. Так что BeginInvoke может дать вам только токен, представляющий "обещание" результата в какой - то момент-и вы используете это обещание, чтобы получить фактический результат с помощью EndInvoke, обычно в обратном вызове.

в .NET 4 это более приятно инкапсулируется с помощью Task и Task<T> конечно, но дженерики не были частью .NET 1, следовательно, несколько более извилистый подход для делегатов.


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

из того, что вы описываете, вам может быть лучше использовать Invoke метод, который вернет значение в том же методе - и в том же потоке, т. е. синхронно. Конечно в этом случае поток может быть заблокирован длительным процессом. Это зависит от того, что вы пытаетесь сделать.