Отмена задачи перекрывается пользовательским вводом

У меня есть асинхронная задача с этим внутри:

while (!cancellationToken.IsCancellationRequested)
{
    Console.Write("Enter workload : ");
    if (!int.TryParse(Console.ReadLine(), out var workTime)) continue;

    Console.Write("Enter the duration of a GC collection (in ms) : ");
    if (!int.TryParse(Console.ReadLine(), out var gctime)) continue;

    Console.Write("Enter the number of requests between 2 GCs : ");
    if (!int.TryParse(Console.ReadLine(), out var gcinter)) continue;

    *do irrelevant stuff here*
}

В настоящее время проверка выхода из цикла, если запрашивается отмена, происходит только в начале цикла. Таким образом, если отмена запрошена, а пользователь еще не ввел рабочую нагрузку, он сможет продолжить выполнение шагов метода. Я не хочу этого.

Есть ли элегантный способ (т.е. не проверять токен отмены между каждой строкой метода), чтобы просто отменить задачу всякий раз, когда это требуется, даже если пользователь что-то пишет или просто независимо от того, что происходит в методе?

Заранее спасибо :)


person Cholesterol    schedule 10.04.2018    source источник


Ответы (1)


Что ж, thread.Abort() может быть решением в вашем случае. Но у него есть свой ящик Пандоры с проблемами. Возможно, вы захотите переосмыслить свою логику, почему вы хотите немедленно прервать поток. Задачи не прерываются. Это связано с тем, что прерывание потока приведет к чрезвычайному уровню неоднозначности состояния и стабильности программы.

Возможно, вы захотите взглянуть на следующие проблемы (они также хотят сделать что-то вроде вас):
Можно ли прервать задачу так же, как прерывание потока (метод Thread.Abort)?
Отменить/прервать задачу в C#

person Zeeshan Ali Khan    schedule 10.04.2018