在C#的分布式缓存开发中,IDistributedCache是微软提供的统一分布式缓存接口,用于操作各类分布式缓存组件,其中Get和GetAsync都是用来从缓存中获取数据的方法,但两者在运行特性、使用场景上存在明显差异。

IDistributedCache 接口基础说明
IDistributedCache接口定义了分布式缓存的通用操作,支持Redis、SQL Server等多种缓存实现,核心方法包含数据的增删改查。其中Get是同步获取缓存的方法,GetAsync是异步获取缓存的方法,两者的返回值都是字节数组,需要开发者自行处理反序列化逻辑。
Get 方法的特点与使用
Get是同步方法,调用时会阻塞当前线程直到缓存操作完成。它适合在已经处于同步上下文的场景中使用,比如控制台程序的简单逻辑、不需要考虑线程阻塞的短耗时操作。
以下是Get方法的使用示例:
using Microsoft.Extensions.Caching.Distributed;
using System.Text;
public class CacheService
{
private readonly IDistributedCache _cache;
public CacheService(IDistributedCache cache)
{
_cache = cache;
}
// 同步获取缓存并反序列化为字符串
public string GetCacheValue(string key)
{
byte[] cacheData = _cache.Get(key);
if (cacheData == null)
{
return null;
}
return Encoding.UTF8.GetString(cacheData);
}
}
GetAsync 方法的特点与使用
GetAsync是异步方法,基于Task<byte[]>返回结果,调用时不会阻塞当前线程,会释放线程去处理其他任务,直到缓存操作完成后再回调继续执行。它适合在异步上下文(比如ASP.NET Core的请求处理流程)中使用,能避免线程阻塞提升应用的吞吐量。
以下是GetAsync方法的使用示例:
using Microsoft.Extensions.Caching.Distributed;
using System.Text;
using System.Threading.Tasks;
public class CacheService
{
private readonly IDistributedCache _cache;
public CacheService(IDistributedCache cache)
{
_cache = cache;
}
// 异步获取缓存并反序列化为字符串
public async Task<string> GetCacheValueAsync(string key)
{
byte[] cacheData = await _cache.GetAsync(key);
if (cacheData == null)
{
return null;
}
return Encoding.UTF8.GetString(cacheData);
}
}
两者的核心区别对比
| 对比维度 | Get 方法 | GetAsync 方法 |
|---|---|---|
| 运行模式 | 同步阻塞 | 异步非阻塞 |
| 返回值类型 | byte[] | Task<byte[]> |
| 线程占用 | 调用期间占用当前线程 | 调用期间释放当前线程,不占用 |
| 适用场景 | 同步上下文、简单控制台程序、无高并发要求的场景 | 异步上下文、ASP.NET Core应用、高并发需要提升吞吐量的场景 |
| 异常处理 | 直接抛出异常 | 异常会封装在Task中,需要await或者访问Result时才会抛出 |
使用注意事项
- 不要在异步方法中混用Get方法,否则会导致线程阻塞甚至死锁,尤其是在ASP.NET Core的请求处理管道中,优先使用GetAsync。
- 如果必须在同步场景使用异步方法,不要直接调用
GetAsync().Result,这种方式同样可能造成死锁,建议通过异步上下文切换或者调整方法设计来适配。 - 两者的缓存获取逻辑本身是一致的,只是调用方式不同,缓存不存在时都会返回null,需要开发者自行处理空值情况。
总结
Get和GetAsync的核心差异在于同步和异步的特性,选择时主要看当前的代码上下文:如果是同步逻辑就用Get,如果是异步逻辑就用GetAsync,遵循异步方法配套使用的原则,能避免很多线程相关的问题,也能让应用的性能表现更符合预期。
IDistributedCacheGetGetAsyncC#分布式缓存修改时间:2026-06-08 21:30:27