AsyncLocal<T> Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa dados de ambiente que são locais para um determinado fluxo de controle assíncrono, como um método assíncrono.
generic <typename T>
public ref class AsyncLocal sealed
public sealed class AsyncLocal<T>
type AsyncLocal<'T> = class
Public NotInheritable Class AsyncLocal(Of T)
Parâmetros de tipo
- T
O tipo dos dados do ambiente.
- Herança
-
AsyncLocal<T>
Exemplos
O exemplo a seguir usa a AsyncLocal<T> classe para persistir um valor de cadeia de caracteres em um fluxo assíncrono. Ele também contrasta o uso com AsyncLocal<T> ThreadLocal<T>.
using System;
using System.Threading;
using System.Threading.Tasks;
class Example
{
static AsyncLocal<string> _asyncLocalString = new AsyncLocal<string>();
static ThreadLocal<string> _threadLocalString = new ThreadLocal<string>();
static async Task AsyncMethodA()
{
// Start multiple async method calls, with different AsyncLocal values.
// We also set ThreadLocal values, to demonstrate how the two mechanisms differ.
_asyncLocalString.Value = "Value 1";
_threadLocalString.Value = "Value 1";
var t1 = AsyncMethodB("Value 1");
_asyncLocalString.Value = "Value 2";
_threadLocalString.Value = "Value 2";
var t2 = AsyncMethodB("Value 2");
// Await both calls
await t1;
await t2;
}
static async Task AsyncMethodB(string expectedValue)
{
Console.WriteLine("Entering AsyncMethodB.");
Console.WriteLine(" Expected '{0}', AsyncLocal value is '{1}', ThreadLocal value is '{2}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value);
await Task.Delay(100);
Console.WriteLine("Exiting AsyncMethodB.");
Console.WriteLine(" Expected '{0}', got '{1}', ThreadLocal value is '{2}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value);
}
static async Task Main(string[] args)
{
await AsyncMethodA();
}
}
// The example displays the following output:
// Entering AsyncMethodB.
// Expected 'Value 1', AsyncLocal value is 'Value 1', ThreadLocal value is 'Value 1'
// Entering AsyncMethodB.
// Expected 'Value 2', AsyncLocal value is 'Value 2', ThreadLocal value is 'Value 2'
// Exiting AsyncMethodB.
// Expected 'Value 2', got 'Value 2', ThreadLocal value is ''
// Exiting AsyncMethodB.
// Expected 'Value 1', got 'Value 1', ThreadLocal value is ''
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Dim _asyncLocalString As New AsyncLocal(Of String)()
Dim _threadLocalString As New ThreadLocal(Of String)()
Async Function AsyncMethodA() As Task
' Start multiple async method calls, with different AsyncLocal values.
' We also set ThreadLocal values, to demonstrate how the two mechanisms differ.
_asyncLocalString.Value = "Value 1"
_threadLocalString.Value = "Value 1"
Dim t1 = AsyncMethodB("Value 1")
_asyncLocalString.Value = "Value 2"
_threadLocalString.Value = "Value 2"
Dim t2 = AsyncMethodB("Value 2")
' Await both calls
await t1
await t2
End Function
Async Function AsyncMethodB(expectedValue As String) As Task
Console.WriteLine("Entering AsyncMethodB.")
Console.WriteLine(" Expected '{0}', AsyncLocal value is '{1}', ThreadLocal value is '{2}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value)
await Task.Delay(100)
Console.WriteLine("Exiting AsyncMethodB.")
Console.WriteLine(" Expected '{0}', got '{1}', ThreadLocal value is '{2}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value)
End Function
Public Sub Main()
AsyncMethodA.Wait()
End Sub
End Module
' The example displays the following output:
' Entering AsyncMethodB.
' Expected 'Value 1', AsyncLocal value is 'Value 1', ThreadLocal value is 'Value 1'
' Entering AsyncMethodB.
' Expected 'Value 2', AsyncLocal value is 'Value 2', ThreadLocal value is 'Value 2'
' Exiting AsyncMethodB.
' Expected 'Value 2', got 'Value 2', ThreadLocal value is ''
' Exiting AsyncMethodB.
' Expected 'Value 1', got 'Value 1', ThreadLocal value is ''
Comentários
Como o modelo de programação assíncrona baseado em tarefa tende a abstrair o uso de threads, AsyncLocal<T> as instâncias podem ser usadas para persistir dados entre threads.
A AsyncLocal<T> classe também fornece notificações opcionais quando o valor associado ao thread atual é alterado, porque ele foi explicitamente alterado definindo a Value propriedade ou alterado implicitamente quando o thread encontrou uma await
ou outra transição de contexto.
Construtores
AsyncLocal<T>() |
Cria uma instância AsyncLocal<T> que não recebe notificações de alteração. |
AsyncLocal<T>(Action<AsyncLocalValueChangedArgs<T>>) |
Cria uma instância local AsyncLocal<T> que recebe notificações de alteração. |
Propriedades
Value |
Obtém ou define o valor dos dados ambiente. |
Métodos
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (Herdado de Object) |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |