Вопрос об аргументе в использовании Task - PullRequest
2 голосов
/ 12 апреля 2011

Ребята, я использовал такой метод, как Task.Factory.StartNew(new Action(()=>{}), cancellationToken);

У меня вопрос по второму аргументу cancellationToken.Поскольку cancellationToken - это переменная в моем методе, в лямбда-выражении я могу отменить свою задачу, используя поле, как это делает msdn;Я не уверен, что это рекомендую.В таком случае, нужен ли здесь второй аргумент?Он передается в метод StartNew, но фактически не используется.Есть ли сценарий, в котором нам нужно использовать этот аргумент?

1 Ответ

2 голосов
/ 12 апреля 2011

Вам нужен этот аргумент, если вы хотите отменить задание.Если ваше приложение не поддерживает или требует отмены, тогда вы можете просто сказать

Task.Factory.StartNew(() => { ... });

Обратите внимание, что отмена совместная, поэтому ваш код должен опросить об отмене и ответить соответственно.

Например,:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task myTask = Task.Factory.StartNew(() =>
    {
        for (...)
        {
            token.ThrowIfCancellationRequested();

            // Body of for loop.
        }
    }, token);

    // ... elsewhere ...
    cts.Cancel();

Вы должны передать маркер отмены методу, иначе он не присоединен к задаче.Код в методе только использует токен для ответа на отмену, либо выбрасывает, либо использует IsCancellationRequested для завершения работы.Хотя задача может быть отменена из лямбды.Самому заданию тоже нужен токен.

Вот еще несколько уточнений:

Передача токена в StartNew связывает токен с заданием.Это имеет два основных преимущества: 1) Если токен запросил отмену до начала выполнения Задачи, то Задача не будет выполнена.Вместо перехода в режим «Бег», он немедленно перейдет в режим «Отменено».Это позволяет избежать затрат на выполнение задачи, если она все равно будет отменена во время выполнения.2) Если тело задачи также отслеживает токен отмены и генерирует исключение OperationCanceledException, содержащее этот токен (что и делает ThrowIfCancellationRequested), то, когда задача видит этот OCE, она проверяет, совпадает ли токен OCE с токеном задачи.Если это так, то это исключение рассматривается как подтверждение совместной отмены, и Задача переходит в состояние Отменено (а не в состояние Сбой).

С http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45

См.общее обсуждение отмены здесь:

http://msdn.microsoft.com/en-us/library/ff963549.aspx для дальнейшего обсуждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...