как обработать ошибку, которая возвращается из асин c задачи и программа должна продолжаться - PullRequest
0 голосов
/ 27 марта 2020

У меня есть код ниже, который выдает ошибку при определенном условии, когда i % 2 == 0 или i % 2 != 0. Я хочу обработать ошибку, и я хочу выполнять программу непрерывно, как это сделать?

  class Program
{
    static async Task Main(string[] args)
    {
        int i = 0;
        while (true)
        {
            i++;
            var task1 = WriteDouble(i);
            var task2 = WriteString(i);

            await Task.WhenAll(task1, task2);

            await Task.Delay(10000);
        }

    }

    private static async Task WriteString(int i)
    {
        if (i % 2 == 0)
        {
            throw new Exception("Error");
        }

        await using var file = new StreamWriter($"C:\\Temp\\test1-{i}.txt");
        await file.WriteLineAsync($"this is string-{i}");
    }

    private static async Task WriteDouble(int i)
    {
        if (i % 2 != 0)
        {
            throw new Exception("Error");
        }
        await using var file = new StreamWriter($"C:\\Temp\\test2-{i}.txt");
        await file.WriteLineAsync($"this is double-{i}");
    }
}

1 Ответ

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

Если вы введете try-catch внутри l oop, ваш l oop сможет продолжить зацикливание, даже если выброшено исключение:

static async Task Main(string[] args)
{
    int i = 0;
    while (true)
    {
        try 
        {
            i++;
            var task1 = WriteDouble(i);
            var task2 = WriteString(i);
            await Task.WhenAll(task1, task2);
            await Task.Delay(10000);
        }
        catch (Exception ex)
        {
        }
    }
}

ОБНОВЛЕНИЕ:

Мы Можно найти задачи, вызывающие исключения, используя Where метод linq:

var throwers = tasks.Where(task => task.Exception != null);

Пример:

static void Main(string[] args)
{
    Task.Run(async () =>
    {
        int i = 0;
        var tasks = new List<Task>();
        while (true)
        {
            try
            {
                i++;
                var task1 = WriteDouble(i);
                var task2 = WriteString(i);
                tasks.Add(task1);
                tasks.Add(task2);
                await Task.WhenAll(tasks);
                await Task.Delay(10000);
            }
            catch (Exception ex)
            {
                var throwers = tasks.Where(task => task.Exception != null);
                var test = ex.Message;                        
            }
        }                
    }).GetAwaiter().GetResult();            
}

И другие методы:

private static async Task WriteString(int i)
{            
    throw new Exception("Error");
    await Task.Delay(1000); // 1 second delay
}

private static async Task WriteDouble(int i)
{
    await Task.Delay(1000); // 1 second delay
}
...