Справочные темы в Windows Phone

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

  • System.Threading.Thread
  • System.ComponentModel.BackgroundWorker
  • System.Threading.ThreadPool.QueueUserWorkItem()

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

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

Ответ 1

Вопрос ответиен, но ответы немного подробны (IMO).

Возьмем каждый по очереди.

System.Threading.Thread

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

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

System.ComponentModel.BackgroundWorker

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

System.Threading.ThreadPool.QueueUserWorkItem

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

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

Ответ 2

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

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

Вы читали MSDN и т.д.

http://www.albahari.com/threadin

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

Ответ 3

Вы не указываете "зачем", но

  • Основная тема - довольно дорого, а не для небольших заданий.
  • Фоновый работник - в основном для работы с интерфейсом UI + Progressbar.
  • ThreadPool - для небольших независимых заданий

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

Ответ 4

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