BeginInvoke () запускает отдельный поток? - PullRequest
9 голосов
/ 07 апреля 2011

В моем приложении WPF я хочу выполнить некоторую работу в потоке, не являющемся пользовательским интерфейсом, чтобы пользовательский интерфейс не отвечал. Для этого я сделал это:

var caller = new AsyncMethodCaller<Pattern>(this.SetPatternType);
caller.BeginInvoke(_patterns, null, null);

И делегат определяется как,

public delegate void AsyncMethodCaller<in T>(IEnumerable<T> data);

Мой вопрос:

Создает ли BeginInvoke() новый поток, и в нем выполняется обратный вызов SetPatternType? Если да, то как долго продлится эта тема?

Этот подход хорош в целом? Если нет, то что с ним не так? И с какими потенциальными проблемами я могу столкнуться?

Я использую C # 4.0 и Visual Studio 2010.


EDIT:

Кроме того, мне нужно несколько руководств по этим вопросам:

Когда я должен сам создать новую тему и когда мне следует использовать BeginInvoke()? И когда я должен использовать DispatcherObject.Dispatcher.BeginInvoke() объект?

Ответы [ 3 ]

12 голосов
/ 07 апреля 2011

Технически это not a new thread это поток Threadpool, и он мигрирует дольше, чем ваш процесс / программа, но может запускать некоторые другие потоки, вызывая асинхронные вызовы немедленно, как только он завершает ваш. Ознакомьтесь со статьями MSDN по Асинхронное программирование и Пул потоков , чтобы получить полную информацию.

И в зависимости от вашего интереса проверьте I / O CompletionPort для получения дополнительной информации.

Асинхронное программирование обычно считается лучше, чем хотя бы синхронный код, но если вы работаете в .NET 4.0, взгляните на Task Parallel Library .

На основании вопроса о редактировании, когда мне следует создавать собственную тему? Всегда лучше использовать программирование на BeginInvoke или Async по сравнению с созданием собственного потока. Строго создавайте свой собственный поток, когда вы уверены, что вам нужен выделенный поток, выполняющий какое-то задание / работу непрерывно, и вы хорошо понимаете механизм синхронизации, необходимый для нескольких потоков в вашем приложении. Старайтесь не создавать новые темы, пока у вас нет действительно веских причин. Вы добавляете поток сегодня и, вероятно, продолжаете, и через два года три разработчика увидят, что для некоторых непрерывных вещей был добавлен дополнительный поток, они добавят еще немного и так далее. Поверьте мне, я видел, как это происходит, поэтому установите правильные методы (например, используя методы Asynch), и люди попытаются следовать этому. Я видел приложения с 150 потоками, имеет ли это смысл на двухъядерном или четырехъядерном компьютере, я так не думаю.

Только что проверив все запущенные процессы на моем ноутбуке Toshiba на наличие таких плохо спроектированных приложений, Toshiba Bluetooth Manager выиграла корону худшей программы на моем компьютере, используя 53 потока. :)

8 голосов
/ 07 апреля 2011

Он использует пул потоков - поэтому он не обязательно создает новый поток, но он работает в потоке, отличном от вызывающего потока (если это не поток пула потоков сам , который завершает свой поток задача перед запланированным вызовом делегата; вряд ли будет использоваться тот же поток).

3 голосов
/ 07 апреля 2011

Dispatcher.CurrentDispatcher - это новый материал в WPF (заменяет материал InvokeRequired в WinForms).

Вы можете использовать Dispatcher, чтобы ставить в очередь любые обновления, которые вы хотите в GUI, и он имеет различные приоритеты, которые вы можете выбрать из

см. эту ссылку MSDN

...