所以我在我的应用程序中使用Redis缓存(Stack Exchange Redis),我有一个静态类来创建连接。我希望能够在这个静态类的某个地方调用异步方法,但是我收到了一个错误“await运算符只能在异步lambda表达式中使用。考虑用异步修饰符创建这个lambda表达式。
我的静态类在下面。
public static class RedisConnection {
private static ConnectionMultiplexer connMulti = null;
private static Lazy<ConnectionMultiplexer> lazyConn = new Lazy<ConnectionMultiplexer>(() => {
string redisConnString = ""; // Need to replace this with call to async method
connectionMultiplexer = ConnectionMultiplexer.Connect(redisConnString);
return connectionMultiplexer;
});
public static ConnectionMultiplexer Conn => lazyConn.Value;
}
基本上,我的注解是,我想用一个异步方法调用来替换那个变量,这个方法获取conn字符串。但是因为Stack Exchange Redis是如何设置的,ConnectionMultiplexer需要同步,所以我需要保持类静态,Lazy连接静态,lambda函数同步。请看下面
public static class RedisConnection {
private static ConnectionMultiplexer connMulti = null;
private static Lazy<ConnectionMultiplexer> lazyConn = new Lazy<ConnectionMultiplexer>(() => {
var redisConnString = await getKey(); // Error
connectionMultiplexer = ConnectionMultiplexer.Connect(redisConnString);
return connectionMultiplexer;
});
public static ConnectionMultiplexer Conn => lazyConn.Value;
}
我能怎么办呢?
1条答案
按热度按时间oyxsuwqo1#
您可以做的是公开
ValueTask<ConnectionMultiplexer>
而不是ConnectionMultiplexer
,如下所示则用法如下:
因此using代码将负责等待连接。并且可能我们将多次调用此getter,这就是为什么我们使用
ValueTask
,因为在访问它时,大部分时间它都已完成。我添加了
Console.WriteLine
和double establishing connection,以证明如果调用它两次,它将尝试连接一次--获取连接的其他调用将返回已完成的ValueTask
,其中连接已准备就绪。这里还有一件事是控制线程ssafety,但是你可以在google上很容易地找到关于异步代码中的线程安全和使用
Lazy
中的线程安全的资源-它甚至已经内置了实现:)(例如,一个构造函数重载接受threadSafe
标志)