Как вызвать асинхронный метод с каким-то приоритетом?
-
23-08-2019 - |
Вопрос
Мне нужно асинхронно вызвать пару методов с разными приоритетами.
Моя первая идея заключалась в том, чтобы использовать 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 (еще не выпущенной) будут обеспечивать создание отдельного пула потоков.
Я думаю, чтобы быть чистым, вам также следует восстановить приоритет потока обратно при выходе из метода!(используйте попытку...наконец-то или что-то подобное)
здесь — это старая, но очень подробная реализация пользовательского пула потоков, поддерживающая разные приоритеты.