ThreadPool.QueueUserWorkItem и EndInvoke

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

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

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

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


person kevindaub    schedule 02.04.2011    source источник


Ответы (2)


arrow_upward
4
arrow_downward

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

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

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

Такой подход отлично подходит, когда у вас есть требование «выстрелил и забыл». Однако, если вам нужно получить результат вызова, лучше использовать BeginInvoke, за которым следует EndInvoke.

person Mårten Wikström    schedule 02.04.2011
comment
Здорово. Это то, что мне нужно было знать. Я делаю огонь и забываю подход. - person kevindaub; 02.04.2011

arrow_upward
0
arrow_downward

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

person BrandonZeider    schedule 02.04.2011
comment
Вы получили первую часть вопроса. Мне нужно это назвать. Но как? - person kevindaub; 02.04.2011
comment
Извините за путаницу, в вашем примере вам не нужно, потому что вы не вызывали BeginInvoke. - person BrandonZeider; 02.04.2011