2011-10-03 4 views
1

В сети есть очень разные мнения о том, как реализовать огонь и забыть шаблон.C# ThreadPool или BeginInvoke без EndInvoke

Некоторые говорят, что не нужно звонить в BeginInvoke, не звонив EndInvoke, если нужно реализовать шаблон с огнем и забытьем.

Другие говорят, что лучше создать отдельный объект ThreadPool. Меня беспокоит стоимость инициализации ThreadPool. В частности, метод вызова только добавляет объект в очередь и затем возвращает.

Для этого «быстрее» создать поток в пуле или просто вызвать метод синхронно? Я хотел бы знать грубый порог работы, который дороже, чем создать поток в пуле.

Есть ли какие-либо документы по этому вопросу и как обстоит дело об исключении, ловящем на бассейн и других реинжинирингах?

+1

Если вы просто вызовите метод синхронно, вы не будете делать «огонь и забыть». Поэтому я считаю, что ваши варианты - ThreadPool, создают Thread самостоятельно (var t = new Thread()) или TPL. – rtalbot

+0

Да, но главный вопрос заключался в том, какой метод быстрее. Я полагаю, что я мог бы просто написать измерение и сравнить результаты в среднем. Может оказаться, что вызов синхронизации быстрее, потому что он вернется быстрее, чем вызов статического метода threadpool methdod. – Juergen

ответ

2

При использовании ThreadPool вы не создаете поток в пуле, вы используете ранее существовавший Thread или дожидаетесь, пока не появится.

Только когда много заданий ждут Пул добавит еще одну тему, но тогда этот будет хорошо использован.

Еще лучше использовать задачи (Fx4 и выше).

+0

Итак, вызов в бассейн очень дешев по сравнению с альтернативой BeginInvoke? – Juergen

+1

@Juergen: BeginInvoke использует пул потоков – BrokenGlass

+0

@BrokenGlass Спасибо, это было ново для меня. Главный вопрос по-прежнему остается: какова стоимость этого звонка? – Juergen

Смежные вопросы