Sdílet prostřednictvím


AsyncLazy<T>.SuppressRelevance Metoda

Definice

Označí následující kód jako irelevantní pro přijímající AsyncLazy<T> objekt pro vytváření hodnot.

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

Návraty

Hodnota, která se má odstranit, aby se obnovila relevance do objektu pro vytváření hodnot.

Poznámky

V některých případech může být asynchronní práce odsunutí uvnitř objektu pro vytváření hodnot. Pokud objekt pro vytváření hodnot nevyžaduje dokončení této práce před dokončením objektu pro vytváření hodnot, může být užitečné použít tuto metodu k označení tohoto kódu jako irelevantní pro objekt pro vytváření hodnot. To může být nezbytné zejména v případě, že oddělovaný úkol může ve skutečnosti obsahovat kód, který může sám čekat na dokončení samotného objektu pro vytváření hodnot. Taková situace by vedla k InvalidOperationException vyvolání z GetValueAsync(CancellationToken) , pokud se objekt pro vytváření hodnot ještě nedokončil, což může v programu způsobit nedeterminované chyby.

Blok using kolem odsunutí kódu může vašemu programu pomoct dosáhnout spolehlivého chování, jak je znázorněno níže.

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

AsyncLazy<T> Pokud byl objekt vytvořen pomocí JoinableTaskFactorymetody , tato metoda také volá SuppressRelevance()Context objekt přidružený k této továrně.

Platí pro