Остановить выполнение строки через оговоренный промежуток времени в C# - PullRequest
0 голосов
/ 16 марта 2020

У меня есть служба Windows, разработанная в C#, которая выполняет некоторые вычисления на данных с равными интервалами времени, скажем, 30 минут. Он извлекает данные из базы данных и вызывает метод CalcData (), который выполняет вычисления бизнес-логики c.

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                AutoCalExecution ae = new AutoCalExecution();
                ae.FetchData();
                ae.CalData();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);                
            }
            Console.ReadLine();
        }
 }

 class AutoCalExecution
{
    public void FetchData()
    {
        // fetch data from db
    }

    public void CalData()
    {
        line1;
        line2;
        line3;
        line4; // this line has som expression which actually does the calculation. 
        line5;
    }  
}

Я дал шаблон кода, который я использую. В CalData(), line4 - это место, где происходит вычисление. Расчет обычно занимает 10 минут. Таким образом, line4 выполняется в течение 10 минут.

Есть сценарий ios, где вычисление может занять более 10 минут. В этом случае я хочу отменить выполнение и go до строки 5 через определенное время, скажем, 15 минут.

Подводя итог, я хочу установить время ожидания для line4 на 15 минут (которое может быть настроено на основе требований). Если оно не заканчивается sh через 15 минут, оно должно остановиться и прийти на line5.

 public void CalData()
    {
        line1;
        line2;
        line3;
        if ( set time to 15 mins exceeds){
            line4; // this line has some expression which actually does the calculation.    
        }
        else 
        {
            Log (Line4 execution did not complete in stipulated time);
        }
        line5;
    }

Как мне установить это условие в C#?

Обновление

Это то, что я пробовал:

var task = Task.Run(() => CalData());
                        if (task.Wait(TimeSpan.FromMinutes(Convert.ToDouble(timeout))))
                        {
                            if (task.Result)
                            {
                                log.Info("Completed");
                            }
                            else
                            {
                                log.Error("Not successful");                                
                            }
                        }

Но проблема здесь в том, что я хочу, чтобы строка 5 выполнялась в этом методе, если строка 4 не заканчивается sh. Есть ли способ, которым я могу написать этот похожий код для фрагмента кода / фрагмента вместо целого метода?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Превратите line4 в задачу.

Сделайте задачу отменяемой с помощью токена отмены.

Используйте токен отмены, который отменяется через 10 минут (настроенное время).

https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource.cancelafter?view=netframework-4.8

https://binary-studio.com/2015/10/23/task-cancellation-in-c-and-things-you-should-know-about-it/

0 голосов
/ 16 марта 2020

Я думаю, вы хотите что-то вроде этого:

var work = Task.Run(() => line4);
if (work.Wait(TimeSpan.FromMinutes(10)))
{
      // Work completed within the timeout
}
else
{
     // Work did not complete within the timeout
}

Обратите внимание, что это на самом деле не остановит выполнение кода 'DoWork', оно продолжится в рабочем потоке, пока это не будет сделано. Также обратите внимание, что использование «Wait» может привести к взаимоблокировке при неправильном использовании, см. Не блокировать в Asyn c Код .

Если вы действительно хотите отменить обработку, вам следует дать DoWork cancellationToken и прервать обработку при отмене токена. Существуют также решения для прерывания работающего потока, , но это не рекомендуется .

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