Страницы

Поиск по вопросам

четверг, 30 мая 2019 г.

Как для обычной задачи задать параметр TaskCreationOptions.LongRunning?

Пример от andreycha паттерна throttling
public async Task CheckServers() { var servers = new List(10000) { ... };
const int ConcurrencyLevel = 100;
// запускаем первые 100 запросов var tasks = servers.Take(ConcurrencyLevel).Select(GetVersion).ToList(); int nextIndex = ConcurrencyLevel;
while (tasks.Count > 0) { // дожидаемся завершения любого запроса var completedTask = await Task.WhenAny(tasks);
// удаляем его из списка tasks.Remove(completedTask);
// добавляем новый запрос, если таковые остались if (nextIndex < servers.Count) { tasks.Add(GetVersion(servers[nextIndex++])); }
string rfbVersion = await completedTask; // работаем с версией } }
Как в подобной реализации красиво задать параметр TaskCreationOptions.LongRunning задачам? Это вообще возможно без использования Task.Factory.StartNew?


Ответ

Смотрите. Давайте разделим Task'и и другие асинхронные функции на те, которые ограничены процессором (то есть, занимают фиксированный поток длительное время), и остальные.
Для первых функций TaskCreationOptions.LongRunning имеет смысл, т. к. мы не хотим надолго блокировать поток из пула потоков. Но такие функции обычно предоставляются в виде синхронных функций, которые мы запускаем через Task.Run. Так что можно, при желании, запустить и через Task.Factory.StartNew
Для остальных асинхронных функций нету понятия «поток, в котором функция бежит», и большую часть времени Task не бежит нигде, просто ожидая окончания await. Для таких функций TaskCreationOptions.LongRunning лишено смысла, и задать его сложно (если и можно вообще). Но в этом случае эта опция и не нужна.

Комментариев нет:

Отправить комментарий