Udostępnij za pośrednictwem


AsyncLazy<T>.SuppressRelevance Metoda

Definicja

Oznacza kod, który następuje jako nieistotny dla fabryki wartości odbierających 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

Zwraca

Wartość do usunięcia w celu przywrócenia istotności do fabryki wartości.

Uwagi

W niektórych przypadkach praca asynchroniczna może być wyłączona wewnątrz fabryki wartości. Jeśli fabryka wartości nie wymaga wykonania tej pracy przed ukończeniem fabryki wartości, może być przydatna metoda oznaczania tego kodu jako nieistotnego dla fabryki wartości. W szczególności może to być konieczne, gdy zadanie spun off może rzeczywiście zawierać kod, który może sam czekać na ukończenie fabryki wartości. Taka sytuacja doprowadziłaby do InvalidOperationException wyrzucenia z GetValueAsync(CancellationToken) fabryki wartości, która nie została jeszcze ukończona, co może powodować błędy niedeterministyczne w programie.

using Blok wokół spun off kodu może pomóc programowi osiągnąć niezawodne zachowanie, jak pokazano poniżej.

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

Jeśli obiekt AsyncLazy<T> został utworzony za pomocą JoinableTaskFactorymetody , ta metoda wywołuje SuppressRelevance()Context również element skojarzony z tą fabryką.

Dotyczy