Freigeben über


AsyncLazy<T>.SuppressRelevance Methode

Definition

Markiert den folgenden Code als irrelevant für die Empfangswert-Factory 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

Gibt zurück

Ein Wert, der zur Wiederherstellung der Relevanz in der Value Factory entsorgt werden soll.

Hinweise

In einigen Fällen kann die asynchrone Arbeit innerhalb einer Value Factory ausgegliedert werden. Wenn für die Wertfactory diese Arbeit nicht abgeschlossen werden muss, bevor die Wertfactory abgeschlossen werden kann, kann es nützlich sein, diese Methode zu verwenden, um diesen Code als irrelevant für die Wertfactory zu markieren. Dies kann insbesondere dann erforderlich sein, wenn der abgespunkene Task tatsächlich Code enthält, der möglicherweise selbst auf die Fertigstellung der Wertfactory selbst wartet. Eine solche Situation würde dazu führen, dass ein InvalidOperationException Auslöser GetValueAsync(CancellationToken) ausgelöst wird, wenn die Wertfactory noch nicht abgeschlossen wurde, was zu nicht determinstischen Fehlern im Programm führen kann.

Ein using Block um den abgespunkenen Code kann Ihrem Programm helfen, zuverlässiges Verhalten zu erzielen, wie unten gezeigt.

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);
  }
}

Wenn mit AsyncLazy<T> einem JoinableTaskFactoryerstellt wurde, ruft SuppressRelevance() diese Methode auch die auf, die Context dieser Factory zugeordnet ist.

Gilt für: