Как вызвать асинхронный метод с каким-то приоритетом?

StackOverflow https://stackoverflow.com/questions/548208

Вопрос

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

Моя первая идея заключалась в том, чтобы использовать 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
}

Это работает или что посоветуете?

Это было полезно?

Решение

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

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

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

  • Вам нужен поток переднего плана.

  • Вам необходимо, чтобы поток имел определенный приоритет.

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top