Приоритет потока объекта .NET Backgroundworker

Я пытаюсь использовать объект .NET Backgroundworker в приложении, которое я разрабатываю.

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

в моем приложении, я пыталась установите приоритет сам внутри функции DoWork, вызвав ...

Thread.CurrentThread.Priority=ThreadPriority.Lowest

...

но это, кажется, не имеют никакого эффекта. Игнорирует ли backgroundworker этот вызов?

Я хотел бы объяснить немного подробнее:

Мои приложения-интернет-клиент, который собирает данные в реальном времени о температуре,влажности и т. д. Из камеры и отправляет на веб-страницу (не веб-сервис) с помощью

system.net.webclient.UploadValuesAsync(...) звонки

Я написал приложение такое, что клиент GUI собирает данные из камеры, время-штампы их, а затем очереди их для загрузки, как так

...

Synclock objlock
    debug.print("Queueing reading...")
    dataQ.Enque(reading)
End Synclock
...

функция Dowork backgroundworker dequeues, а затем загружает так...

..............

Do
        if dataQ.count() <> 0 then
            Synclock objlock
              reading = dataQ.DeQue()
            End Synclock
            Dim client As New System.Net.WebClient
            ...put the reading in NameValueCollection and upload to server page
            req = new NameValueCollection
            ...
            ...
            client.UploadValuesAsync(uri, "POST", req)
        endif
        thread.sleep(1) 'without this line the CPU usage goes upto 100% and seems to slow other tasks!
    Loop

................

когда я запускаю программу, я нахожу, что всякий раз, когда UploadValuesAsync вызывается print out окно отладки останавливается. Я также добавил инструкции debug к посмотрите, сколько показаний в очереди в любое время. Если эта задача действительно выполняется с низким приоритетом, я ожидал, что количество очередей быстро увеличится по мере получения данных, а затем уменьшится только тогда, когда передний план простаивает, а данные не приобретаются. Но это не так. Как только чтение добавляется в очередь, оно выводится из очереди и загружается. Таким образом, количество очередей всегда равно 1 или 0!

что-то не так в моем подходе? Не должен ли я использовать background-worker возражать вообще?

кстати, это в двухъядерном ноутбуке под управлением Windows XP.

4 ответов


просто чтобы добавить к тому, что уже сказали Джон и Марк:

фоновые потоки не имеют низший приоритет. Разница между потоками переднего плана и фоном заключается в том, что среда CLR завершит процесс после запуска потоков переднего плана. Потоки пула потоков-это фоновые потоки.

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


Да, что - то не так с вашим подходом-вы в основном плотно зацикливаетесь, когда очередь пуста. Какими бы ни были приоритеты, это плохая идея.

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

У меня есть пример реализации очереди производителя/потребителя в моей резьбы учебник - см. примерно на полпути вниз страницы. Кстати, вам понадобится какой-то способ сказать процессу снятия очереди, что он закончен. (Например, запрос нулевой ссылки или другого специального значения.) Этот код был написан pre-generics, но его должно быть легко обновить.


он не претендует на низкий приоритет - фон означает a: не поток пользовательского интерфейса, и b: он не будет поддерживать процесс. На самом деле, это, вероятно, относится к ThreadPool потоки.

Если вам нужен конкретный приоритетный поток, используйте свой собственный Thread object-но я бы не рекомендовал даже это нормально...

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


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

http://devpinoy.org/blogs/jakelite/archive/2008/12/20/threading-patterns-the-worker-thread-pattern.aspx