#c# #delegates #begininvoke
#c# #делегаты #begininvoke
Вопрос:
Я читал, что AsyncCallback
функция будет выполнять все задачи последующей обработки после завершения вызова делегата. Мой вопрос в том, в чем разница в написании задач последующей обработки после / ниже, EndInvoke
поскольку EndInvoke
они будут ждать, пока вызов делегата не вернется.
Ответ №1:
Смысл использования метода BeginInvoke() делегата заключается в том, что цель будет выполняться асинхронно. Если вы вызываете EndInvoke() сразу после BeginInvoke(), то больше нет смысла его использовать. Вы получите точно такое же поведение, просто вызвав делегата напрямую, за вычетом накладных расходов и головной боли при обработке потоков.
Значение получает обратный вызов при завершении целевого метода, асинхронно сразу после его завершения. Только затем вызовите EndInvoke(), он завершается немедленно. Это очищает системные ресурсы и повторно создает исключение, когда целевой метод его выдал. Не пропускайте вызов EndInvoke(), как предложено в одобренном ответе, вы потеряете ресурсы как минимум на 10 минут.
Ответ №2:
Вы могли бы вообще не вызывать EndInvoke и полагаться только на обратный вызов. Таким образом, инициация исходит от самого делегата, а не от вас, и вам не нужно решать, когда завершится вызов.
Комментарии:
1. Спасибо Bas. Но разве ничего после EndInvoke не будет выполнено только после успешного завершения делегирования?
2. Вы можете проверить, завершена ли операция с помощью IsCompleted, по предоставленному параметру IAsyncResult.
3. Не пропускайте вызов EndInvoke().