【问题标题】:Unable to await SetStringAsync in IDistributedCache无法在 IDistributedCache 中等待 SetStringAsync
【发布时间】:2017-08-19 07:06:59
【问题描述】:

我正在使用带有 Microsoft.Extensions.Caching.Redis 2.0 的 .NET Core 2.0。为什么 IDistributedCache.SetStringAsync 实际上没有标记为异步,因此不可等待?

        var services = new ServiceCollection();
        services.AddDistributedRedisCache(options =>
        {
            options.Configuration = "127.0.0.1";
            options.InstanceName = "master";
        });

        var provider = services.BuildServiceProvider();

        var cache = provider.GetService<IDistributedCache>();

        // Does not compile
        await cache.SetStringAsync("mykey", "myvalue");

【问题讨论】:

  • 看起来接口IDistributedCache没有那个方法:github.com/aspnet/Caching/blob/dev/src/…
  • ...但是您可以使用此扩展名github.com/aspnet/Caching/blob/dev/src/… 来做到这一点...编译器错误说明了什么?正在等待的方法是否标有异步?
  • 你是从异步方法调用 SetStringAsync 吗?
  • 是的,这是我的愚蠢错误!问题是我的方法应该是异步的,而不是 SetStringAsync

标签: c# async-await


【解决方案1】:

这些方法被定义为返回Task(它们是DistributedCacheExtensions中的扩展方法):

 public static Task SetStringAsync(this IDistributedCache cache, string key, string value)
 {
     return cache.SetStringAsync(key, value, new DistributedCacheEntryOptions());
 }

你可以使用await 和(MSDN)这样的方法

应用await 运算符的任务通常通过调用实现基于任务的异步模式的方法返回。它们包括返回 TaskTask&lt;TResult&gt;System.Threading.Tasks.ValueType&lt;TResult&gt; 对象的方法。

但是你不能在没有标记为async的方法中使用await,这就是编译错误的原因:

await 只能用在 async 关键字修改的异步方法中。


如果您对团队将SetStringAsync 标记为异步方法会有什么不同感兴趣,例如:

public static async Task SetStringAsync

然后查看 SO "async Task then await Task" vs "Task then return task"

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2020-06-18
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多