无法在IDistributedCache中等待SetStringAsync

时间:2017-08-19 07:07:00

标签: c# async-await

我正在使用.NET Core 2.0和Microsoft.Extensions.Caching.Redis 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");

1 个答案:

答案 0 :(得分:2)

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

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

您可以使用await这样的方法(MSDN

  

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

但是您无法在未标记为await的方法中使用async,这就是编译错误的原因:

  

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

如果您对团队将SetStringAsync标记为异步方法会产生什么影响感兴趣,例如:

public static async Task SetStringAsync

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