Mi sono appena imbattuto in uno strano comportamento utilizzando i metodi asincroni nelle strutture. Qualcuno può spiegare perché questo sta accadendo e, soprattutto, se c'è una soluzione alternativa? Ecco una semplice struttura di prova solo per il gusto di una manifestazione del problemaIl valore del campo privato di Struct non viene aggiornato utilizzando un metodo asincrono
public struct Structure
{
private int _Value;
public Structure(int iValue)
{
_Value = iValue;
}
public void Change(int iValue)
{
_Value = iValue;
}
public async Task ChangeAsync(int iValue)
{
await Task.Delay(1);
_Value = iValue;
}
}
Ora, usiamo la struttura e fare le seguenti chiamate
var sInstance = new Structure(25);
sInstance.Change(35);
await sInstance.ChangeAsync(45);
La prima riga crea un'istanza della struttura e la sInstance._Value
il valore è 25
. La seconda riga aggiorna il valore sInstance._Value
e diventa 35
. Ora la terza riga non fa nulla ma mi aspetto che aggiorni il valore sInstance._Value
a 45
ma lo sInstance._Value
rimane 35
. Perché? C'è un modo per scrivere un metodo asincrono per una struttura e modificare il valore di un campo di una struttura?
Soluzione: non utilizzare le strutture mutabili con cui iniziare. Fondamentalmente, ho il sospetto che la tua struttura stia ricevendo un riquadrato per il verificarsi di callback e che la mutazione * stia accadendo, ma all'interno di quella casella. Ma davvero, non usare le strutture mutevoli. Questa è un'interessante * nuova * (per me) variazione su come essere morsi da loro, ma ci sono * un sacco * di trucchi come questo. –
Interessante e fortemente correlato a [Come gestire gli effetti collaterali prodotti da async/attendi quando si tratta di tipi di valori mutabili?] (Http://stackoverflow.com/questions/24811287/). –
Volevo sottolineare che rendere la struttura immutabile non è un'opzione nel mio caso. L'intero sistema è stato codificato molto tempo fa e dobbiamo solo estendere alcune parti con metodi asincroni. Riscrivere l'intera cosa non sembra fattibile a questo punto, ma capisco perfettamente il concetto di avere strutture per essere immutabili. C'è una soluzione alternativa più economica? –