Как проверить, запущена ли Задача, и перезапустить, если она не запущена. - PullRequest
0 голосов
/ 01 марта 2020

У меня есть несколько задач, которые я хочу выполнять в течение очень длительного периода времени. Я хочу запустить задачи, а затем проверить в al oop, все ли они еще выполняются, и перезапустить задачу, если одна из них будет отменена или остановлена ​​иным образом. Код, который я имею, не обнаруживает, что задачи запускаются, и перезапускает их снова и снова. Может кто-нибудь помочь мне, пожалуйста? Или есть лучший способ сделать то, что я хочу? Спасибо.

    public async Task TaskBx(CancellationToken ct)
    {
        while (true)
        { 
         //Do stuff
         await Task.Delay(500);

        }
    }
    public async Task TaskAx(CancellationToken ct)
    {
        while (true)
        {
         //Do stuff
         await Task.Delay(500);

        }
    }





    private async Task StartTrade(CancellationToken ct)
    {

        Task TA = Task.Factory.StartNew(() => TaskAx(ct));
        Task TB = Task.Factory.StartNew(() => TaskBx(ct));

        while (true)
        {

            if ((TA != null) && (TA.IsCompleted == true)) { _ = Task.Factory.StartNew(() => TaskAx(ct)); Console.WriteLine("Start TaskA"); } else { Console.WriteLine("Started A"); }
            if ((TB != null) && (TB.IsCompleted == true)) { _ = Task.Factory.StartNew(() => TaskBx(ct)); Console.WriteLine("Start TaskB"); } else { Console.WriteLine("Started B"); }

            await Task.Delay(50);

        }

    }

1 Ответ

1 голос
/ 01 марта 2020

Вы не переназначаете TA и TB для своего нового Task экземпляра. Кроме того, вы не избавляетесь от старого экземпляра, что является плохой идеей. Наконец, нет необходимости звонить Task.Factory.StartNew().

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

    static void Main(string[] args)
    {
        var token = new CancellationToken();

        var mainTask = StartTrade(token);

        while (true)
        {
            if (Console.ReadKey().Key == ConsoleKey.Escape)
            {
                break;
            }
        }
    }

    public async static Task TaskBx(CancellationToken ct)
    {
        Console.WriteLine("Enter TaskBx");

        while (true)
        {
            if (ct.IsCancellationRequested)
                break;

            //Do stuff

            await Task.Delay(1000);

            break; // For demonstration.
        }

        Console.WriteLine("Exit TaskBx");
    }

    public async static Task TaskAx(CancellationToken ct)
    {
        Console.WriteLine("Enter TaskAx");

        while (true)
        {
            if (ct.IsCancellationRequested)
                break;

            //Do stuff

            await Task.Delay(2000);

            break; // For demonstration.
        }

        Console.WriteLine("Exit TaskAx");
    }

    private async static Task StartTrade(CancellationToken ct)
    {

        Task TA = TaskAx(ct);
        Task TB = TaskBx(ct);

        while (true)
        {
            if (ct.IsCancellationRequested)
                break;

            if ((TA != null) && (TA.IsCompleted == true))
            {
                TA.Dispose();
                TA = null;

                TA = TaskAx(ct);
                Console.WriteLine("Start TaskA");
            }
            else
            {
                Console.WriteLine("Started A");
            }

            if ((TB != null) && (TB.IsCompleted == true))
            {
                TB.Dispose();
                TB = null;

                TB = TaskBx(ct);
                Console.WriteLine("Start TaskB");
            }
            else
            {
                Console.WriteLine("Started B");
            }

            await Task.Delay(500);

        }

    }
...