Как убить задание в тупиковой ситуации - PullRequest
0 голосов
/ 03 апреля 2020

Я работаю с Задачами в C#. У меня есть ситуация для запуска моего кода в Задаче. Но иногда этот код может go привести к тупиковой ситуации из-за некоторых проблем с алгоритмом. Я пытаюсь добиться механизма ожидания таким образом, чтобы

-Я запускал задачу
-Дождался несколько раз до завершения sh Выполнение задачи -Если задача не выполняется в конкретном раз, я убью эту задачу

Это мне нужно достичь. Пример кода приведен ниже.

Проблема в том, что даже если я отменяю задание, оно выполняется без выхода. Может ли кто-нибудь помочь в этом?

    public static class MyTest
    {
        public static void StartTask()
        {
            CancellationTokenSource tokenSource = new CancellationTokenSource();
            CancellationToken token = tokenSource.Token;
            Task task = new Task(() => TaskMethod(), token);

            task.Start();

            if (!task.Wait(1000))
            {
                tokenSource.Cancel();
                Console.WriteLine("Cancelled");

            }
        }


        public static void TaskMethod()
        {
            while (true)
            {
                Thread.Sleep(2000);

                Console.WriteLine("Haiiiiiii");
            }
        }

    }```

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Проблема не в тупике. Ваша задача никогда не будет отвечать на запрос отмены.

Задача не завершается магией c, вы должны проверить свойство IsCancellationRequested CancellationTokenSource, изменить его с локальной переменной на поле, так что ваш TaskMethod может получить к нему доступ.

Попробуйте это:

public static class MyTest
{
    CancellationTokenSource tokenSource = new CancellationTokenSource();

    public static void StartTask()
    {
        CancellationToken token = tokenSource.Token;

        // Use Task.Run
        Task task = Task.Run(() => TaskMethod(), token);

        if (!task.Wait(1000))
        {
            tokenSource.Cancel();
            Console.WriteLine("Cancelled");

        }
    }


    public static void TaskMethod()
    {
        while (!tokenSource.IsCancellationRequested)
        // -----------------^^
        {
            Thread.Sleep(2000);

            // optional check:
            if(!tokenSource.IsCancellationRequested)
                Console.WriteLine("Haiiiiiii");
        }
    }

}
0 голосов
/ 03 апреля 2020

TaskMethod() должен вернуть Task, и вместо Thread.Sleep() использовать await Task.Delay(), в этом случае TaskMethod() должно быть помечено async.

...