在 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 的异步实现。

同步版本有效。

Basic Usage Guide 状态:

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 对象以及从哪里获取它?


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 和变量捕获之前,这非常有用。