Condividi tramite


AsyncLazy<T>.SuppressRelevance Metodo

Definizione

Contrassegna il codice che segue come irrilevante per la factory di valori di ricezione AsyncLazy<T> .

public Microsoft.VisualStudio.Threading.AsyncLazy<T>.RevertRelevance SuppressRelevance ();
member this.SuppressRelevance : unit -> Microsoft.VisualStudio.Threading.AsyncLazy<'T>.RevertRelevance
Public Function SuppressRelevance () As AsyncLazy(Of T).RevertRelevance

Restituisce

Valore da eliminare per ripristinare la pertinenza nella factory dei valori.

Commenti

In alcuni casi il lavoro asincrono può essere disattivato all'interno di una factory di valori. Quando la factory del valore non richiede che questo lavoro venga completato prima che la value factory possa essere completata, può essere utile usare questo metodo per contrassegnare il codice come irrilevante per la value factory. In particolare, questo può essere necessario quando l'attività partizionato può effettivamente includere il codice che può essere in attesa del completamento della factory del valore stesso. Tale situazione porterebbe a un InvalidOperationException avvio da GetValueAsync(CancellationToken) se la factory del valore non è già stata completata, che può introdurre errori non determinstici nel programma.

Un using blocco intorno al codice bloccato può aiutare il programma a ottenere un comportamento affidabile, come illustrato di seguito.

class MyClass {
  private readonly AsyncLazy<int> numberOfApples;

  public MyClass() {
    this.numberOfApples = new AsyncLazy<int>(async delegate {
      // We have some fire-and-forget code to run.
      // This is *not* relevant to the value factory, which is allowed to complete without waiting for this code to finish.
      using (this.numberOfApples.SuppressRelevance()) {
        this.FireOffNotificationsAsync();
      }

      // This code is relevant to the value factory, and must complete before the value factory can complete.
      return await this.CountNumberOfApplesAsync();
    });
  }

  public event EventHandler? ApplesCountingHasBegun;

  public async Task<int> GetApplesCountAsync(CancellationToken cancellationToken) {
    return await this.numberOfApples.GetValueAsync(cancellationToken);
  }

  private async Task<int> CountNumberOfApplesAsync() {
    await Task.Delay(1000);
    return 5;
  }

  private async Task FireOffNotificationsAsync() {
    // This may call to 3rd party code, which may happen to call back into GetApplesCountAsync (and thus into our AsyncLazy instance),
    // but such calls should *not* be interpreted as value factory reentrancy. They should just wait for the value factory to finish.
    // We accomplish this by suppressing relevance of the value factory while this code runs (see the caller of this method above).
    this.ApplesCountingHasBegun?.Invoke(this, EventArgs.Empty);
  }
}

Se è stato creato con un JoinableTaskFactoryoggetto , questo metodo chiama SuppressRelevance() anche l'oggetto AsyncLazy<T>Context associato a tale factory.

Si applica a