我正在使用.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");
答案 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
运算符的任务通常是通过调用实现基于任务的异步模式的方法返回的。它们包括返回Task
,Task<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"