首页 > 解决方案 > 实现异步代码的自动重启

问题描述

我有一些长时间运行的代码:

Action GetSomeAction()=> () => {
//some code that takes a long time...
};

我这样运行它:

_currentTask = Task.Run(GetSomeAction());

如果抛出异常,我需要确保它重新启动。一开始,我是这样写的:

async Task EnsureTaskExecution()
{
    try
    {
        await _currentTask;
    }
    catch (Exception x)
    {
        Log.Error($"task exception: {x.GetType()} : {x.Message} {x.StackTrace} {x.InnerException?.GetType()} {x.InnerException?.Message}.");
        //...?
    }
}

我如何正确重启它?将其插入 catch 块似乎是个坏主意,因为它引入了递归:

_currentTask = Task.Run(GetSomeAction());
await EnsureTaskExecution();

有没有更好的选择?有推荐的模式吗?这似乎是一项几乎微不足道的任务,但我找不到任何东西。

标签: c#async-await

解决方案


推荐阅读