Поделиться через


AsyncLazy<T>.SuppressRelevance Метод

Определение

Помечает следующий код как неуместный к фабрике получения 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

Возвращаемое значение

Значение, которое необходимо удалить для восстановления релевантности в фабрике значений.

Комментарии

В некоторых случаях асинхронную работу можно закрутить внутри фабрики значений. Если фабрика значений не требует завершения этой работы до завершения фабрики значений, может быть полезно использовать этот метод, чтобы пометить этот код как неуместный к фабрике значений. В частности, это может быть необходимо, если задача выключения может на самом деле включать код, который может ожидать завершения самой фабрики значений. Такая ситуация приведет к возникновению проблемы, GetValueAsync(CancellationToken) если фабрика значений InvalidOperationException еще не завершена, что может привести к недетерминированным сбоям в программе.

Блок using вокруг отключаемого кода может помочь вашей программе добиться надежного поведения, как показано ниже.

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> Если объект был создан с помощью JoinableTaskFactory, этот метод также вызывает SuppressRelevance() для объекта , связанного Context с этой фабрикой.

Применяется к