我目前有以下异步方法:
private SomeObject _someObject = null;
public async Task<SomeObject> GetObjectAsync()
{
await sslim.WaitAsync();
if (_someObject == null)
{
_someObject = await InitializeSomeObjectAsync(); //starts calls to alot of async Task methods
}
sslim.Release();
return _someObject;
}
如果上面的代码是一个热门路径并且被多次调用,那么改用Valuetask是否安全/可以?:
private SomeObject _someObject = null;
public async Valuetask<SomeObject> GetObjectAsync()
{
await sslim.WaitAsync();
if (_someObject == null)
{
_someObject = await InitializeSomeObjectAsync(); //starts calls to alot of async Task methods
}
sslim.Release();
return _someObject;
}
我不确定的是 sslim.WaitAsync 锁定调用,它总是会导致代码路径永远不会完全同步(即使 _someObject 已经初始化),这与将 Valuetask 用于可能的路径相反同步执行?
另一个想法,也许将 SemaphoreSlim 调用更改为同步版本也有意义?
private SomeObject _someObject = null;
public async Valuetask<SomeObject> GetObjectAsync()
{
sslim.Wait();
if (_someObject == null)
{
_someObject = await InitializeSomeObjectAsync(); //starts calls to alot of async Task methods
}
sslim.Release();
return _someObject;
}
我计划对上述变体进行一些基准测试,但只是想从更了解哪些选项值得考虑的人那里获得一些反馈。
谢谢。