ThreadPool.QueueUserWorkItem и EndInvoke - PullRequest
1 голос
/ 02 апреля 2011

Нужно ли вызывать EndInvoke для делегата, переданного в ThreadPool.QueueUserWorkItem?

Я использую это предложение для вызова ThreadPoolQueueWorkItem.

ThreadPool.QueueUserWorkItem(
    delegate { someDelegate(arg1, arg2); }
);

Если мне нужно позвонить в endinvoke, как мне это вызвать? Спасибо.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2011

Нет, вам не нужно звонить.На самом деле вы не должны: -)

Вы должны вызывать EndInvoke только для завершения асинхронного вызова, ранее начатого с помощью вызова BeginInvoke.

В предоставленном вами коде вы выполняете делегат синхронноиз потока ThreadPool.

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

0 голосов
/ 02 апреля 2011

Вам не нужно, нет, но в соответствии с MSDN вам следует избегать потенциальных утечек памяти. Вот замечательный пост в блоге Фила Хаака , в котором обсуждается эта проблема, а также его вспомогательный класс по сценариям использования огня и забудьте.

...