metodi asincroni: ci sono dei problemi di concorrenza che il programmatore deve affrontare

3

Diciamo che questo metodo getPhotoAsync può essere invocato alcune volte al secondo e che le risposte dal server remoto possono richiedere da mezzo secondo a trenta secondi, a seconda della dimensione del payload. Quindi ci saranno diverse richieste concorrenti in sospeso. .NET tiene traccia di "dietro le quinte" di quale risposta va con quale richiesta? C'è qualche possibilità che info possa essere associato alla risposta sbagliata dal server remoto?

public async Task<PhotoWithInfo> getPhotoAsync(object info, string photoid)
{
          //<snip> build url with photoid 

          var request = WebRequest.Create(new System.Uri(url));
          var response = await request.GetResponseAsync();   

          byte[] photo=null;

        // <snip> read the response stream and return a byte array
          photo =  myMemoryStream.ToArray();

          var  foo  = new PhotoWithInfo();
          foo.bytes = photo;
          foo.Info = info;           

          return foo;
}
    
posta TR888 01.08.2016 - 22:37
fonte

1 risposta

5

Is there any chance that info could be associated with the wrong response from the remote server?

No.

Quando viene eseguito il metodo await , il framework firma la tua attività sul thread corrente come una continuazione e restituisce il controllo del flusso di esecuzione a te. Quindi ora hai un riferimento a quel compito. Quando viene restituito il metodo asincrono, il framework popolerà l'attività con il valore corretto, o si bloccherà quando si interroga l'attività per il suo valore se il metodo asincrono non è ancora stato restituito.

In ogni caso, stai mantenendo l'attività corretta, in modo da ottenere il valore corretto. WebRequest è una classe atomica; non condivide lo stato con altre istanze di WebRequest e l'utilizzo di WebRequest qui è locale alla classe e all'attività. Inoltre, il tuo WebResponse è legato a questa specifica istanza WebRequest . Quindi no, non esiste alcuna possibilità di condizioni di gara, perché non esiste uno stato condiviso.

    
risposta data 01.08.2016 - 22:51
fonte

Leggi altre domande sui tag