Фоновые темы в Windows Phone - PullRequest
11 голосов
/ 09 ноября 2011

До сих пор во время моего опыта разработки приложений для Windows Phone 7 я замечал, что существуют разные способы выполнения действия в асинхронном потоке.

  1. System.Threading.Thread
  2. System.ComponentModel.BackgroundWorker
  3. System.Threading.ThreadPool.QueueUserWorkItem ()

Я не вижу ощутимой разницы между этими методами (кроме того, что первые два более прослеживаемы).

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

Ответы [ 4 ]

15 голосов
/ 09 ноября 2011

На этот вопрос вроде бы получен ответ, но ответы немного подробны (ИМО).

Давайте рассмотрим каждый из них по очереди.

System.Threading.Thread

Все потоки (в любом случае в CLR) в конечном итоге представлены этим классом.Однако вы, вероятно, включили это в запрос, когда мы можем захотеть создать экземпляр самостоятельно.

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

System.ComponentModel.BackgroundWorker

Это удобная оболочка класса для рабочего элемента ThreadPool.Этот класс предназначен только для разработчиков, ориентированных на пользовательский интерфейс, которым иногда требуется использовать фоновый поток.Его события, отправляемые в потоке пользовательского интерфейса, упрощают его использование.

System.Threading.ThreadPool.QueueUserWorkItem

Это рабочая рабочая лошадка, когда у вас естьнекоторая работа, которую вы хотите делать в фоновом потоке.Это исключает затраты на выделение и освобождение отдельных потоков для выполнения какой-либо задачи.Он ограничивает количество экземпляров потока, чтобы предотвратить слишком большое количество доступных ресурсов, которые слишком много операций пытаются выполнить параллельно.

QueueUserWorkItem - мой предпочтительный вариант для запуска фоновых операций.

1 голос
/ 09 ноября 2011

Возможно, это зависит от того, что вы пытаетесь сделать, вы перечислили 3 очень разные модели потоков.

  1. Основные потоки
  2. Предназначены для приложений с отдельным потоком пользовательского интерфейса.
  3. Пул управляемых потоков

Читали ли вы MSDN и т. Д ...

http://www.albahari.com/threadin

Http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

1 голос
/ 09 ноября 2011

Вы не говорите «зачем», но

  1. Basic Thread - довольно дорогой, не для небольших работ
  2. Backgroundworker - в основном для пользовательского интерфейса + Progressbar работа
  3. ThreadPool - для небольших самостоятельных работ

Я думаю, что TPL не поддерживается в SL, что очень жаль.

0 голосов
/ 09 ноября 2011

Фоновый рабочий, как правило, лучше использовать, когда ваш пользовательский интерфейс необходимо обновлять по мере продвижения потока, поскольку он обрабатывает вызов функций обратного вызова (таких как обратный вызов OnProgress) в потоке пользовательского интерфейса, а не в фоновом потоке.Два других не делают эту работу.Это зависит от вас.

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