C# 如何在后台启动Redis连接而不等待

C# 如何在后台启动Redis连接而不等待,c#,.net-core,redis,aws-lambda,stackexchange.redis,C#,.net Core,Redis,Aws Lambda,Stackexchange.redis,我想作为后台任务启动Redis连接,这样用户就不需要等待Redis连接建立。如果未设置Redis连接或Redis不可用,则应在不影响用户的情况下从源获取数据 该应用程序是一个AWS Lambda Web API项目。我想避免个别请求中的连接延迟,但我也不想通过在启动时等待连接来增加冷启动时间 我正在使用StackExchange Redis客户端库 为了实现这一点,我想在后台任务中启动Redis连接。不需要额外的后台任务。StackExchange.Redis库允许使用ConnectionMul

我想作为后台任务启动Redis连接,这样用户就不需要等待Redis连接建立。如果未设置Redis连接或Redis不可用,则应在不影响用户的情况下从源获取数据

该应用程序是一个AWS Lambda Web API项目。我想避免个别请求中的连接延迟,但我也不想通过在启动时等待连接来增加冷启动时间

我正在使用StackExchange Redis客户端库


为了实现这一点,我想在后台任务中启动Redis连接。

不需要额外的后台任务。StackExchange.Redis库允许使用
ConnectionMultiplexer.ConnectAsync
进行异步连接。现在需要的是一种检查连接是否完整的方法,如果不完整,请使用其他源

一种方法是在服务中包装数据访问,该服务在其构造函数中异步打开连接。它的方法可以检查连接是否打开,如果没有,则使用Redis或回退源(如数据库)


这太模糊了——适用于哪种应用程序?用户无需等待Redis连接建立,这意味着什么?对于桌面应用程序,这意味着UI不会冻结。Web应用在等待时不会冻结。以线程安全的方式
对您的代码意味着什么?如果您不修改全局状态,就不会有风险,一个简单的
等待myClient.ConnectAsync()
就可以了,假设您的Redis库有异步方法,而这些都与线程安全或冻结无关。您要求使用回退缓存。这与线程无关,而且。。。可能已经实现了,至少部分实现了,这是一个。您有一个问题X(如何使用Redis并回退到另一个源),并且假设Y是解决方案(后台线程),因此当事情不起作用时,您会询问Y。但在本例中,Y与此无关X@Shaheer*******如果你这么做了,你还得等待********。不管怎样,发布你的真实代码。没有理由这么做。并不是人们不理解你的问题。你问错问题了。如果要测试连接,请在启动时进行测试。后续连接不会花费那么长时间。如果需要,请添加Redis运行状况检查。如果您怀疑连接会中断,请编写代码,使其返回到数据库或任何其他来源。非常感谢Panagiotis Kanavos。看起来很有希望。在这个实现中,当调用
ConnectAsync
时,连接将实际启动。但是线程在等待它完成时不会阻塞。这与在数据库连接中调用
OpenAsync()
相同。在这两种情况下,您都会得到一项任务,您可以立即或稍后等待该任务。即使
wait
也不会阻止调用线程。它将释放它,一旦异步操作完成,执行将在
wait
之后恢复。在此期间,该线程可用于服务其他请求如果任务中出现任何异常,并且如果我想重新启动任务,那么如何在上述实现中完成。当等待任务或调用
.Result
时,将引发异常。如果希望以不同的方式处理错误,请创建一个方法,将异步操作包装在
try/catch
中,记录错误等,并从构造函数调用该方法
class MyFallbackService
{
    Task<ConnectionMultiplexer> _redisTask;

    public MyFallbackService(string redisConf,string conString)
    {
        _redisTask = ConnectionMultiplexer.ConnectAsync(redisConf);
        ...
    }

    public async Task<string> GetValue(string key)
    {
        if (_redisTask.IsCompleted)
        {
            var redis=_redisTask.Result;
            var db=redis.GetDatabase(...);
            var value= await db.StringGetAsync(key);
        }
        else
        {
            //Use the fallback source
        }
    }
}
services.AddSingleton(new MyFallbackService(...));