Как вызвать метод async с каким-то приоритетом? - PullRequest
0 голосов
/ 14 февраля 2009

Мне нужно вызвать несколько методов асинхронно с разными приоритетами.

Моей первой идеей было использование ThreadPool и изменение приоритета потока следующим образом:

static void Run()
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(SomeMethod));
}

static void SomeMethod(object o)
{
  Thread.CurrentThread.Priority = ThreadPriority.BelowNormal; // is this ok?
  // do some work here
}

Это работает или что вы рекомендуете?

Ответы [ 4 ]

4 голосов
/ 14 февраля 2009

Согласно http://msdn.microsoft.com/en-us/library/0ka9477y.aspx, это не будет работать, если вы нацеливаетесь на 2.0, это намекает на некоторые различия в 3.5, но конкретно не упоминает приоритет:

Когда не нужно использовать потоки пула потоков

Существует несколько сценариев, в которых целесообразно создавать собственные потоки и управлять ими вместо использования потоков пула потоков:

  • Требуется резьба переднего плана.

  • Требуется, чтобы поток имел определенный приоритет.

  • У вас есть задачи, из-за которых поток блокируется на длительные периоды времени. Пул потоков имеет максимальное количество потоков, поэтому большое количество заблокированных потоков пула потоков может помешать запуску задач.

  • Вам необходимо разместить нити в однопоточной квартире. Все темы ThreadPool находятся в многопоточной квартире.

  • Вам необходимо иметь стабильную идентификацию, связанную с потоком, или назначить поток задаче.

Скорее всего, вам придётся придумать собственную реализацию и напрямую заняться созданием потоков.

Вопрос: Чего вы пытаетесь достичь, есть ли у вас набор задач для обработки и вы хотите, чтобы задачи с высоким приоритетом выполнялись первыми, а задачи с более низким приоритетом - позже; или вы на самом деле хотите темы с другим приоритетом?

1 голос
/ 14 февраля 2009

Это определенно ужасно идея.

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

Кроме того, потоки пула потоков предназначены для повторного использования, и, изменяя приоритет потока, вы меняете ожидание задачи, которая получит поток для использования после выполнения вашей подпрограммы.

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

Если вы хотите, чтобы потоки выполняли только ваши задачи, вам нужно создать свой собственный пул потоков (используя класс System.Thread), а затем сделать то же самое, используя код-обертку, чтобы заставить задачу выполняться на основе приоритета. .

Новые классы в пространстве имен System.Threading в .NET 4.0 (еще не выпущены) будут обрабатывать создание отдельного пула потоков для вас.

0 голосов
/ 14 февраля 2009

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

0 голосов
/ 14 февраля 2009

Я думаю, чтобы быть чистым, вы должны также восстановить приоритет потока, когда выйдете из метода! (используйте try ... finally или что-то подобное)

...