Я нашел ответ (или, по крайней мере, и ответ). Это связано с разбиением на части. Ответ SO здесь получил его для меня. Таким образом, в основном, в верхней части моей функции «Процесс», если я перейду от этого:
static void Process(int[] items)
{
Parallel.ForEach(items, (msToWait) => { ... });
}
к этому
static void Process(int[] items)
{
var partitioner = Partitioner.Create(items, EnumerablePartitionerOptions.NoBuffering);
Parallel.ForEach(partitioner, (msToWait) => { ... });
}
, то он захватывает работу по одному. Для более типичного случая параллели для каждого, когда тело не занимает больше секунды, я, конечно, могу видеть разбивку на части работы. В моем случае, однако, каждая часть тела может занять от полсекунды до 5 часов. Я, конечно, не хотел бы, чтобы группа из 10-секундных элементов разнообразия была заблокирована одним 5-часовым элементом. Таким образом, в этом случае издержки «по одному» того стоят.
Вы можете использовать HttpUtility.HtmlEncode / HtmlDecode или UrlEncode / UrlDecode, в зависимости от ситуации.
Для справки, решение моей проблемы было в:
System.Web.HttpUtility.UrlEncode
, который поддерживается всеми версиями .Net framework = p
В частности, я использую перегрузку, которая принимает строку в качестве аргумента . Выполнение этого для всех значений параметров сделает их безопасными для POSTing.