Codice asincrono del refattore in C #

1

Ho il seguente frammento di codice:

public Task DistributeAsync(BankAccount account, decimal amount)
{
    lock (account)
    {
        return repository.AddLoanAsync(account, amount).ContinueWith(task => 
        {
            if (!task.Result)
            {
                throw new LoanException();
            }
        }
    }
}

// Somewhere else in the code:
var distributeTask = distributor.DistributeAsync(bankAccount, 42000);

E mi chiedo come posso riscriverlo correttamente usando async / await parole chiave per una maggiore leggibilità. Attualmente sto affrontando il problema che non sono autorizzato a utilizzare await nel corpo di un'istruzione lock . Sarebbe apprezzato qualsiasi aiuto per farmi nella giusta direzione.

Sono consapevole che l'istruzione lock non è thread-safe, questo frammento fa parte di un esercizio più grande e un'altra domanda è spiegare perché quel lock non aiuta a rendere sicuro il thread del codice!

    
posta J. Doe 01.12.2018 - 12:23
fonte

1 risposta

1

Utilizza await invece di restituire Task e ContinueWith , quindi usa SemaphoreSlim per il blocco. Il tuo codice senza blocco dovrebbe apparire in questo modo.

if (!(await repository.AddLoanAsync(account, amount)))
{
   throw new LoanException();
}

Dovresti chiamarlo così

await distributor.DistributeAsync(bankAccount, 42000);

Dovresti usare return invece di usare await quando solo la cosa che il metodo fa sta restituendo un'altra attività.

    
risposta data 02.12.2018 - 12:19
fonte

Leggi altre domande sui tag