我正忙着为Windows 8项目提供异步服务,并且有一些此服务的异步调用,应该每次只调用一次。任务可以有多个等待者?
public async Task CallThisOnlyOnce()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
既然你不能封装在一个锁声明一个异步调用,我想到了使用AsyncLock
模式,但比我想我不妨试试这样的事情:
private Task _callThisOnlyOnce;
public Task CallThisOnlyOnce()
{
if(_callThisOnlyOnce != null && _callThisOnlyOnce.IsCompleted)
_callThisOnlyOnce = null;
if(_callThisOnlyOnce == null)
_callThisOnlyOnce = CallThisOnlyOnceAsync();
return _callThisOnlyOnce;
}
private async Task CallThisOnlyOnceAsync()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
因此,你会最后只会同时执行一次调用CallThisOnlyOnceAsync
,并且多个awaiters挂钩在同一个Task上。
这是做到这一点的“有效”方式还是这种方法存在一些缺陷?
我喜欢这两个答案,但既然你添加了一个实施建议,我选择了你的。另外,我尝试使用Nuget安装库,但在我的Windows应用商店项目中失败(无法解析Microsoft.Bcl.Async) – UrbanEsc
尝试检查“包括预发布”复选框。我的软件包是预发行的(但NuGet没有正确检测到),'Microsoft.Bcl.Async'也是预发行的(NuGet能够正确检测到)。 –