Sto giocando con un servizio asincrono per un progetto Windows 8 e ci sono alcune chiamate asincrone di questo servizio, che dovrebbero essere chiamate una sola volta alla volta.Un'attività può avere più attenditori?
public async Task CallThisOnlyOnce()
{
PropagateSomeEvents();
await SomeOtherMethod();
PropagateDifferentEvents();
}
Dal momento che non si può incapsulare una chiamata asincrona in una dichiarazione di blocco, ho pensato di utilizzare il modello AsyncLock
, ma di quanto ho pensato che potrei anche provare qualcosa di simile:
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();
}
Pertanto si avrebbe finire con la chiamata CallThisOnlyOnceAsync
eseguita solo una volta simultaneamente, e più attendenti collegati alla stessa attività.
È questo un modo "valido" di fare questo o ci sono alcuni inconvenienti a questo approccio?
Mi sono piaciute entrambe le risposte, ma da quando hai aggiunto una proposta di implementazione, ho scelto la tua. Inoltre, ho provato ad installare la tua libreria usando Nuget, ma non sono riuscito nel mio progetto Windows Store (impossibile risolvere Microsoft.Bcl.Async) – UrbanEsc
Prova a spuntare la casella di controllo "include prerelease". Il mio pacchetto è prerelease (ma NuGet non lo rileva correttamente), e 'Microsoft.Bcl.Async' è anche prerelease (che NuGet rileva correttamente). –