AsyncLocal<T> Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt Umgebungsdaten dar, die für einen bestimmten asynchronen Steuerungsfluss lokal sind, z. B. eine asynchrone Methode.
generic <typename T>
public ref class AsyncLocal sealed
public sealed class AsyncLocal<T>
type AsyncLocal<'T> = class
Public NotInheritable Class AsyncLocal(Of T)
Typparameter
- T
Der Typ der Umgebungsdaten.
- Vererbung
-
AsyncLocal<T>
Beispiele
Im folgenden Beispiel wird die AsyncLocal<T> Klasse verwendet, um einen Zeichenfolgenwert über einen asynchronen Fluss hinweg beizubehalten. Es unterscheidet sich auch von der Verwendung von 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 ''
Hinweise
Da das aufgabenbasierte asynchrone Programmiermodell die Verwendung von Threads tendenziell abstrahiert, können Instanzen verwendet werden, AsyncLocal<T> um Daten über Threads hinweg zu speichern.
Die AsyncLocal<T> Klasse stellt auch optionale Benachrichtigungen bereit, wenn sich der dem aktuellen Thread zugeordnete Wert ändert, entweder weil er durch Festlegen der Value Eigenschaft explizit geändert wurde oder implizit geändert wurde, wenn der Thread einen await oder einen anderen Kontextübergang gefunden hat.
Konstruktoren
| Name | Beschreibung |
|---|---|
| AsyncLocal<T>() |
Instanziiert eine AsyncLocal<T> Instanz, die keine Änderungsbenachrichtigungen empfängt. |
| AsyncLocal<T>(Action<AsyncLocalValueChangedArgs<T>>) |
Instanziiert eine AsyncLocal<T> lokale Instanz, die Änderungsbenachrichtigungen empfängt. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Value |
Dient zum Abrufen oder Festlegen des Werts der Umgebungsdaten. |
Methoden
| Name | Beschreibung |
|---|---|
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| GetHashCode() |
Dient als Standardhashfunktion. (Geerbt von Object) |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |