PLINQ AsParallel () с более низким приоритетом? - PullRequest
6 голосов
/ 04 марта 2011

возможно ли выполнить некоторые из моих запросов PLINQ AsParallel () - с более низким приоритетом, чем у других?(Или некоторые с более высоким приоритетом, чем другие). Возможно ли это с PLinq, или мне придется избегать PLINQ и делать все самостоятельно?

РЕДАКТИРОВАТЬ / ОБНОВИТЬ:

Будет ли этоможно вызвать

Thread.Sleep(0)

внутри параллельно выполняемого метода, когда я хочу заархивировать более низкий приоритет?Или это очень плохая практика / взлом?

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

К сожалению, в PLINQ это невозможно сделать напрямую.

Вы можете сделать это в большей части остальной библиотеки параллельных задач, создав пользовательский TaskScheduler . Это позволит вам иметь собственные «приоритеты» при использовании Parallel.For или ForEach.

Однако возможность настройки TaskScheduler не была предоставлена ​​с PLINQ, поскольку PLINQ требует очень строгих гарантий от TaskScheduler, и существует опасение, что разоблачение этого будет очень проблематичным.


EDIT / UPDATE:

Можно ли позвонить

Thread.Sleep (0)

Это «понизит» приоритет, но, к сожалению, имеет свои проблемы, особенно в сочетании с PLINQ. Это может вызвать голодание потока в ThreadPool, так как вы будете "спать" в потоках ThreadPool.

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

2 голосов
/ 04 марта 2011

AsParallel - API очень высокого уровня.Вы действительно должны использовать Thread s, если вы хотите детализированный контроль над тем, что происходит, используя Priority

...