Что использовать в качестве объекта asyncState (или где его получить) в StackExchange.Redis в C # - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь преобразовать синхронное хранилище 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;
        }


    }

}

1 Ответ

0 голосов
/ 22 февраля 2019

Я не уверен, означает ли утверждение, что я должен установить его, если я хочу использовать асинхронный API, или я могу установить его и получить некоторую выгоду от этого.

Этоозначает, что вы можете установить его, если вам нужно.

Если позже, какими будут эти преимущества?

"Асинхронное состояние" используется Модель асинхронного программирования (APM) .Вам нужно будет предоставлять асинхронное состояние только в том случае, если ваше приложение интенсивно использует APM, и вам необходимо сохранить его таким образом. Асинхронный шаблон на основе задач (TAP) способен делать все, что может делать APM, с более простым и более обслуживаемым кодом.Таким образом, вы будете использовать APM только в том случае, если у вас большая кодовая база и у вас еще не было времени на ее преобразование.Это единственная причина для передачи «асинхронного состояния» этому API.

Я не знаю, если / когда установить что-либо как объект _asyncState и где его получить?

«Асинхронное состояние» - это то, чего хочет ваша программа.Идея состоит в том, что вы предоставляете объект методу Begin*, а затем вы получите тот же объект в вашем обратном вызове, когда асинхронная операция завершится.Это было гораздо полезнее много лет назад, до того как появились лямбды и переменный захват.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...