Правильный способ Fire-and-Forget асинхронного делегата - PullRequest
7 голосов
/ 13 апреля 2010

Считай меня ржавым на тему асинхронных делегатов.

Если я хочу вызвать метод асинхронно, в стиле «забей и забудь», это подходящий способ?

Action action = DoSomething;
action.BeginInvoke(action.EndInvoke, null);

Метод DoSomething() перехватывает все исключения и обрабатывает их внутренне.

Уместен ли вызов на EndInvoke? Необходимые?

Есть ли более ясный способ добиться того же поведения?

Ответы [ 3 ]

11 голосов
/ 13 апреля 2010

Новый способ (в .NET 4) заключается в следующем:

Task.Factory.StartNew(() => DoSomething());
5 голосов
/ 26 сентября 2012

Следует отметить, что Task.Factory.StartNew(() => DoSomething()); не в состоянии наблюдать любое потенциальное исключение, выброшенное методом DoSomething. Я знаю, что это то, что нужно при запуске операции «забей и забудь», но что касается .Net 4, любая задача с ненаблюдаемым исключением, завершаемая сборщиком мусора, перерастет в необработанное исключение, которое убьет ваш процесс. , Однако в .Net 4.5 изменилось поведение по умолчанию (см. Ключевые слова async & await).

5 голосов
/ 13 апреля 2010

«Старая школа» в .NET 3.5 заключается в использовании ThreadPool:

ThreadPool.QueueUserWorkItem(s => DoSomething());

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

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