在 C# 的 StackExchange.Redis 中用作 asyncState 对象(或从哪里获取)的内容
What to use as asyncState object (or where to get it from) in StackExchange.Redis in C#
我尝试使用 StackExchange.Redis nuget 将同步 Redis 存储转换为 .NET Core 2.2 Web api 的异步实现。
同步版本有效。
Additionally, if you plan to make use of the asynchronous API and you require the Task.AsyncState to have a value, this can also be specified:
int databaseNumber = ...
object asyncState = ...
IDatabase db = redis.GetDatabase(databaseNumber, asyncState);
我不确定该声明是否意味着我 必须设置它 如果我想使用异步 API 或者我 可以设置它 并从中受益。
如果是后者,那会有什么好处?
以下是我当前的(简化的)代码,我不知道if/when将什么设置为 _asyncState 对象以及从哪里获取它?
- ConnectionMultiplexerAsync() 和 DatabaseAsync() 进行一些惰性初始化
- 存储旨在作为单例添加到依赖项注入
- 然后在 services/controllers 中用于存储比简单字符串更复杂的数据。
using Microsoft.Extensions.Options;
using StackExchange.Redis;
using System;
using System.Threading.Tasks;
namespace Test
{
public class Settings
{
public string Config { get; set; }
}
public class MyAsyncRedisStorageService
{
private readonly Settings _settings;
private IConnectionMultiplexer _connectionMultiplexer;
private IDatabase _database;
private object _asyncState;
public MyAsyncRedisStorageService(IOptions<Settings> settings)
{
_settings = settings?.Value ?? throw new ArgumentNullException(nameof(settings));
_asyncState = "what to use as asyncState object and when to get it from where?";
}
protected async Task<IConnectionMultiplexer> ConnectionMultiplexerAsync()
{
if (_connectionMultiplexer == null) _connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(_settings.Config);
return _connectionMultiplexer;
}
protected async Task<IDatabase> DatabaseAsync()
{
if (_database == null)
{
IConnectionMultiplexer cm = await ConnectionMultiplexerAsync();
_database = cm.GetDatabase();
}
return _database;
}
protected async Task<IDatabase> DatabaseAsync(object asyncStateObject)
{
if (_database == null)
{
IConnectionMultiplexer cm = await ConnectionMultiplexerAsync();
_database = cm.GetDatabase(asyncState: asyncStateObject);
}
return _database;
}
public async Task<bool> StoreValueAsync(string key, string val)
{
//IDatabase db = await DatabaseAsync(_asyncState);
IDatabase db = await DatabaseAsync();
bool success = await db.StringSetAsync(key, val);
return success;
}
public async Task<string> ReadValueAsync(string key)
{
//IDatabase db = await DatabaseAsync(_asyncState);
IDatabase db = await DatabaseAsync();
string value = await db.StringGetAsync(key);
return value;
}
}
}
I am not sure if the statement means I have to set it if I want to use the asnychronous API or I can set it and get some benefit of doing so.
这意味着如果需要,您可以设置它。
If the later what would that benefits be?
"Async state" 由 Asynchronous Programming Model (APM). You would need to provide async state only if your application heavily uses APM and you need to keep it that way for now. The Task-based Asynchronous Pattern (TAP) 使用,能够完成 APM 可以做的所有事情,而且代码更简单、更易于维护。因此,如果您拥有大型代码库并且还没有时间转换它,那么您只会使用 APM。这是将 "async state" 传递给此 API 的唯一原因。
I don't know if/when to set what as the _asyncState object and where to get it from?
"Async state" 是您的程序想要的任何内容。这个想法是,您向 Begin*
方法提供一个对象,然后当异步操作完成时,您将在回调中获得相同的对象。在很多年前,在出现 lambda 和变量捕获之前,这非常有用。
我尝试使用 StackExchange.Redis nuget 将同步 Redis 存储转换为 .NET Core 2.2 Web api 的异步实现。
同步版本有效。
Additionally, if you plan to make use of the asynchronous API and you require the Task.AsyncState to have a value, this can also be specified:
int databaseNumber = ...
object asyncState = ...
IDatabase db = redis.GetDatabase(databaseNumber, asyncState);
我不确定该声明是否意味着我 必须设置它 如果我想使用异步 API 或者我 可以设置它 并从中受益。 如果是后者,那会有什么好处?
以下是我当前的(简化的)代码,我不知道if/when将什么设置为 _asyncState 对象以及从哪里获取它?
- ConnectionMultiplexerAsync() 和 DatabaseAsync() 进行一些惰性初始化
- 存储旨在作为单例添加到依赖项注入
- 然后在 services/controllers 中用于存储比简单字符串更复杂的数据。
using Microsoft.Extensions.Options;
using StackExchange.Redis;
using System;
using System.Threading.Tasks;
namespace Test
{
public class Settings
{
public string Config { get; set; }
}
public class MyAsyncRedisStorageService
{
private readonly Settings _settings;
private IConnectionMultiplexer _connectionMultiplexer;
private IDatabase _database;
private object _asyncState;
public MyAsyncRedisStorageService(IOptions<Settings> settings)
{
_settings = settings?.Value ?? throw new ArgumentNullException(nameof(settings));
_asyncState = "what to use as asyncState object and when to get it from where?";
}
protected async Task<IConnectionMultiplexer> ConnectionMultiplexerAsync()
{
if (_connectionMultiplexer == null) _connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(_settings.Config);
return _connectionMultiplexer;
}
protected async Task<IDatabase> DatabaseAsync()
{
if (_database == null)
{
IConnectionMultiplexer cm = await ConnectionMultiplexerAsync();
_database = cm.GetDatabase();
}
return _database;
}
protected async Task<IDatabase> DatabaseAsync(object asyncStateObject)
{
if (_database == null)
{
IConnectionMultiplexer cm = await ConnectionMultiplexerAsync();
_database = cm.GetDatabase(asyncState: asyncStateObject);
}
return _database;
}
public async Task<bool> StoreValueAsync(string key, string val)
{
//IDatabase db = await DatabaseAsync(_asyncState);
IDatabase db = await DatabaseAsync();
bool success = await db.StringSetAsync(key, val);
return success;
}
public async Task<string> ReadValueAsync(string key)
{
//IDatabase db = await DatabaseAsync(_asyncState);
IDatabase db = await DatabaseAsync();
string value = await db.StringGetAsync(key);
return value;
}
}
}
I am not sure if the statement means I have to set it if I want to use the asnychronous API or I can set it and get some benefit of doing so.
这意味着如果需要,您可以设置它。
If the later what would that benefits be?
"Async state" 由 Asynchronous Programming Model (APM). You would need to provide async state only if your application heavily uses APM and you need to keep it that way for now. The Task-based Asynchronous Pattern (TAP) 使用,能够完成 APM 可以做的所有事情,而且代码更简单、更易于维护。因此,如果您拥有大型代码库并且还没有时间转换它,那么您只会使用 APM。这是将 "async state" 传递给此 API 的唯一原因。
I don't know if/when to set what as the _asyncState object and where to get it from?
"Async state" 是您的程序想要的任何内容。这个想法是,您向 Begin*
方法提供一个对象,然后当异步操作完成时,您将在回调中获得相同的对象。在很多年前,在出现 lambda 和变量捕获之前,这非常有用。