Compartir a través de


AsyncLazy<T>.SuppressRelevance Método

Definición

Marca el código que sigue como irrelevante para el generador de valores receptores 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

Devoluciones

Valor que se va a eliminar para restaurar la relevancia en el generador de valores.

Comentarios

En algunos casos, el trabajo asincrónico puede estar desactivado dentro de una factoría de valores. Cuando el generador de valores no requiere que este trabajo finalice antes de que se pueda completar la factoría de valores, puede ser útil usar este método para marcar ese código como irrelevante para el generador de valores. En concreto, esto puede ser necesario cuando la tarea spun off puede incluir realmente código que puede esperar la finalización del propio generador de valores. Esta situación provocaría que se produzca GetValueAsync(CancellationToken) una InvalidOperationException excepción si el generador de valores aún no se ha completado, lo que puede introducir errores no determinstices en el programa.

Un using bloque alrededor del código spun off puede ayudar al programa a lograr un comportamiento confiable, como se muestra a continuación.

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> Si se creó con , JoinableTaskFactoryeste método también llama SuppressRelevance() a en el Context asociado a ese generador.

Se aplica a