Я пытаюсь преобразовать синхронное хранилище Redis в асинхронную реализацию для веб-API .NET Core 2.2, используя nuget StackExchange.Redis.
Синхронная версия работает.
Руководство по базовому использованию гласит:
Кроме того, если вы планируете использовать асинхронный API и вам требуется, чтобы значение Task.AsyncState имело значение, это также может быть указано:
int databaseNumber = ...
object asyncState = ...
IDatabase db = redis.GetDatabase(databaseNumber, asyncState);
Я не уверен, означает ли утверждение, что я должен установить его , если я хочу использовать асинхронный API или I можете установить и получить от этого выгоду.Если позже, что это даст?
Ниже приведен мой текущий (упрощенный) код, и я не знаю, можно ли / когда установить объект в качестве объекта _asyncState и где его получить?
- ConnectionMultiplexerAsync () и DatabaseAsync () выполняют ленивую инициализацию
- Хранилище предназначено для добавления в качестве одиночного к инъекции зависимостей
- и затем используется всервисы / контроллеры для хранения более сложных данных, чем простые строки.
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;
}
}
}