Длительное время ожидания действия в .Net Core - PullRequest
0 голосов
/ 23 января 2019

Как я могу реализовать тайм-аут для потенциально длительного действия лямбда-действия?Я попытался обернуть действие в задание, а затем использовать маркер отмены для принудительного истечения времени ожидания, но безрезультатно.

    public void LongRunningTask()
    {
        ExecuteSafely(() => //do something );
    }

    private void ExecuteSafely(Action action)
    {
        try
        {
            action();
        }
        catch
        {
            // just don't crash 
        }
    }

Новая реализация согласно 1-му ответу:

public void Information<T>(string messageTemplate, T propertyValue)
{
    ExecuteSafely(() => _logger.Information(messageTemplate, propertyValue));
}        

private void ExecuteSafely(Action action)
{
    try
    {
        var cts = new CancellationTokenSource();
        cts.CancelAfter(new TimeSpan(0, 0, 1));

        try
        {
            Task.Run(action, cts.Token).Wait();
        }
        catch (TaskCanceledException e)
        {
            System.Diagnostics.Debug.WriteLine(e.ToString());
            //here you know the task is cancelled due to timeout
        }
    }
    catch (Exception e)
    {
        System.Diagnostics.Debug.WriteLine(e.ToString());
        // just don't crash 
    }
}

Этоработает правильно только когда я перехожу в Task.Run, но не когда я перехожу или позволяю ему работать.Возможно, есть какая-то проблема с закрытием лямбды в действии?

1 Ответ

0 голосов
/ 23 января 2019

Вы должны использовать CancellationTokenSource

    void Execute(Action action, TimeSpan timeout)
    {
        var cts = new CancellationTokenSource();
        cts.CancelAfter(timeout);

        try
        {
            Task.Run(action, cts.Token).Wait();
        }
        catch (TaskCanceledException e)
        {
            //here you know the task is cancelled due to timeout
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...