Почему AsyncCallback? - PullRequest
       36

Почему AsyncCallback?

1 голос
/ 01 мая 2011

Я прочитал, что функция AsyncCallback выполнит все задачи пост-обработки после завершения вызова делегата. Мой вопрос заключается в том, в чем отличие написания задач пост-обработки после / ниже EndInvoke, так как EndInvoke будет ожидать возврата вызова делегата.

Ответы [ 2 ]

4 голосов
/ 02 мая 2011

Смысл использования метода делегата BeginInvoke () заключается в том, что цель будет работать асинхронно. Если вы вызываете EndInvoke () сразу после BeginInvoke (), то больше нет смысла его использовать. Вы получите точно такое же поведение, просто вызвав делегат напрямую, минус накладные расходы и головные боли потоков.

Значение получает обратный вызов при завершении целевого метода, асинхронно сразу после этого. Только затем вызывает EndInvoke (), он завершается немедленно. Это очищает системные ресурсы и повторно генерирует исключение, когда целевой метод его выбрасывает. Не пропускайте вызов EndInvoke (), как предложено в ответе с голосованием, вы утечете ресурсы как минимум на 10 минут.

2 голосов
/ 01 мая 2011

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

...