Korzystam z usługi asynchronicznej dla projektu Windows 8 i jest kilka asynchronicznych wywołań tej usługi, które powinny być wywoływane tylko jeden raz na raz.Czy zadanie może mieć wiele osób oczekujących?
public async Task CallThisOnlyOnce()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
Ponieważ nie można upakować połączenia transmisji asynchronicznej w blokadzie rachunku, myślałem o użyciu wzorca AsyncLock
, ale nie myślałem, że równie dobrze może spróbować czegoś takiego:
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();
}
Dlatego byś kończy się wywołanie CallThisOnlyOnceAsync
wykonywane tylko raz jednocześnie, a wiele osób oczekujących zahaczyło o to samo zadanie.
Czy jest to "prawidłowy" sposób postępowania, czy też istnieją pewne wady tego podejścia?
Podobały mi się obie odpowiedzi, ale ponieważ dodałaś propozycję wdrożenia, wybrałam twoją. Ponadto próbowałem zainstalować bibliotekę za pomocą Nuget, ale nie udało się w moim projekcie Windows Store (nie można rozwiązać Microsoft.Bcl.Async). – UrbanEsc
Spróbuj zaznaczyć pole wyboru "wstępne wydanie wstępne". Mój pakiet jest w wersji wstępnej (ale NuGet nie wykrywa tego poprawnie), a 'Microsoft.Bcl.Async' jest także w wersji wstępnej (którą NuGet wykrywa poprawnie). –