Сбрасывает индексатор TaskFactory? - PullRequest
0 голосов
/ 14 марта 2012

с

        for (var i = 0; i < 3; i++)
        {
            Task t = Task.Factory.StartNew(Consume);
        }

Я создаю, например, 3 задачи в 3 разных потоках.Задачи получают идентификатор от 1 до 3, прежде чем они будут работать с потоком данных.Этот процесс может быть прерван нажатием кнопки, задачи закрываются с помощью кнопки отмены.Это происходит, я проверяю это, называя статус задач.Когда я снова начинаю обработку, запускается новый экземпляр класса создания задач и снова создаются 3 задачи.но на этот раз у них нет идентификаторов от 1 до 3, но от 4 до 6. Мне приходят на ум два вопроса:

  1. Разве сбор мусора не убивает все задачи автоматически, когда токенподнялся?Нужно ли вручную завершать или утилизировать их?

  2. Когда токены были корректно убиты токеном, как я могу остановить индексатор TaskFactory, чтобы 3 новые задачиполучить их идентификаторы снова на 1?

Я хочу использовать идентификаторы задач для индексации массивов, специфичных для задачи.Конечно, есть обходной путь для этого, но почему - задача приносит его

1 Ответ

2 голосов
/ 14 марта 2012

Несколько вещей.Существует распространенное заблуждение, что создание Task означает, что вы создаете новый поток.Судя по вашему вопросу, создается впечатление, что вы создаете задачи в одном потоке.Эти задачи будут поставлены в очередь и поставлены в очередь планировщиком по умолчанию (если вы не указали пользовательский планировщик), который использует ThreadPool.Если вы знакомы с этим, вы будете знать, что он будет создавать столько потоков, сколько необходимо, и будет использовать их по мере необходимости.Вы можете одновременно создать 10 задач, которые выполняются, скажем, всего в 3 потоках.

Однако, чтобы напрямую ответить на ваши вопросы:

  1. Нет,Когда вызывается источник токена отмены метода Cancel, он переводит токен в отмененное состояние, и задачи, которым был назначен токен для этого конкретного источника токена , будут отменены.На этом этапе Task (READ: не поток) будет помечен для сборки мусора, если и только если вы не держите его ссылки, как и любой другой объект ввремя выполнения, которое можно собрать в гараже.

    Если оно может быть успешно собрано, оно будет уничтожено.Тем не менее, вспомогательный поток помещается обратно в список доступных потоков ThreadPool.Он может быть снова использован с другой задачей, или, если другая задача никогда не запускается, ThreadPool в конечном итоге освободит этот Thread и заставит его быть GC'd.

  2. Вы не можете сделать это.Идентификаторы, которые назначены, на самом деле не назначаются TaskFactory.Когда Task запущен, ему фактически не присваивается идентификатор. никогда не будет присвоен идентификатор, если вы не запросите Task.Id.Идентификатор создается из static int в классе Task, который увеличивается каждый раз при запросе идентификатора.

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

...