Фоновые темы в Windows Phone
До сих пор во время моего опыта разработки приложений для Windows Phone 7 я замечал, что существуют разные способы запуска действия в асинхронном потоке.
- System.Threading.Thread
- System.ComponentModel.BackgroundWorker
- System.Threading.ThreadPool.QueueUserWorkItem ()
Я не видел никакой ощутимой разницы между этими методами (кроме того, что первые два более прослеживаемы).
Есть ли что-то, что вы, ребята, рассматриваете, прежде чем использовать какой-либо из этих методов? Какой из них вы бы предпочли и почему?
4 ответа
На вопрос вроде бы отвечают, но ответы на него немного не детальны (IMO).
Давайте возьмем каждого по очереди.
System.Threading.Thread
Все потоки (в любом случае в CLR) в конечном итоге представлены этим классом. Однако вы, вероятно, включили это в запрос, когда мы можем захотеть создать экземпляр самостоятельно.
Ответ редко. Обычно рабочая лошадка для выполнения фоновых задач является Threadpool
, Однако есть некоторые обстоятельства, когда мы хотели бы создать нашу собственную нить. Как правило, такой поток будет жить большую часть времени выполнения приложения. Он будет проводить большую часть своей жизни в заблокированном состоянии на ручке ожидания. Иногда мы сигнализируем эту ручку, и она оживает, чтобы сделать что-то важное, но затем она снова ложится спать. Мы не используем рабочий элемент Threadpool для этого, потому что мы не поддерживаем идею, что он может стоять в очереди за большим набором нерешенных задач, некоторые из которых могут быть (возможно, непреднамеренно) заблокированы в другое время ожидания.
System.ComponentModel.BackgroundWorker
Это дружественная оболочка класса для рабочего элемента ThreadPool. Этот класс предназначен только для разработчиков, ориентированных на пользовательский интерфейс, которым иногда требуется использовать фоновый поток. Его события, отправляемые в потоке пользовательского интерфейса, упрощают его использование.
System.Threading.ThreadPool.QueueUserWorkItem
Это повседневная рабочая лошадка, когда у вас есть работа, которую вы хотите выполнять в фоновом потоке. Это исключает затраты на выделение и освобождение отдельных потоков для выполнения какой-либо задачи. Он ограничивает количество экземпляров потока, чтобы предотвратить слишком большое количество доступных ресурсов, которые слишком много операций пытаются выполнить параллельно.
QueueUserWorkItem
мой предпочтительный вариант для вызова фоновых операций.
Вы не говорите "зачем", но
- Basic Thread - довольно дорогой, не для небольших работ
- Backgroundworker - в основном для работы с UI + Progressbar
- ThreadPool - для небольших самостоятельных работ
Я думаю, что TPL не поддерживается в SL, что очень жаль.
Возможно, это зависит от того, что вы пытаетесь сделать, вы перечислили 3 очень разные модели потоков.
- Основные потоки
- Предназначен для приложений с отдельным потоком пользовательского интерфейса.
- Пул управляемых потоков
Вы читали MSDN и т.д...
http://www.albahari.com/threading
http://http//msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx
Фоновый рабочий, как правило, лучше использовать, когда ваш пользовательский интерфейс необходимо обновлять по мере продвижения вашего потока, поскольку он обрабатывает вызов функций обратного вызова (таких как обратный вызов OnProgress) в потоке пользовательского интерфейса, а не в фоновом потоке. Два других не делают эту работу. Это зависит от вас, чтобы сделать это.