我正忙着爲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能夠正確檢測到)。 –