3

Im eine Message-Klasse (abgeleitet von DelegatingHandler) in einem Web-api 2 ProjektAwait & Thread-Sicherheit in C# arbeiten mit Variablen

Mit dieser Methode wird unter Verwendung von:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 

Innerhalb dieser im die Verwendung von folgender Ausschnitt:

string stringVariable = HelperClass.SomeFunctionThatReturnsAStringValue(); 

Weiter unten in dem Code, den ich dann einen Anruf tätigen, wie so

HttpResponseMessage response = await base.SendAsync(request, cancellationToken); 

schließlich am Ende i dann wie folgt vorgehen:

if (!String.IsNullOrWhiteSpace(stringVariable)) 
       response.Headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(Bearer, stringVariable)); 

Ich habe die unten in der web.config festgelegt, die auch aus der Lektüre anderen SO Beiträge empfohlen.

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
<system.web> 
    <httpRuntime targetFramework="4.5" /> 
    ... 
</system.web> 

Meine Frage ist um die stringVariable.
Ist es möglich, dass dieser Wert im Code-Snippet @ am Ende anders gesetzt wird, wenn er als Antwort zurückgeschickt wird, wenn mehrere Anfragen gleichzeitig eingehen?

(mein Verständnis ist der Verarbeitungs-Thread freigegeben wird, wenn await so Sicherheitsfaden genannt wird, könnte ein Problem sein)

dh: für UserA die Variable gesetzt wird, aber wenn BenutzerB Anfrage @ gleichzeitig macht den Wert für UserA wird auf UserB wegen der Warte-Logik angewendet

+2

Der Thread wird erst freigegeben, wenn die Anweisung 'wait' ausgeführt wird und jede Anforderung ihre eigene' stringVaraible' hat, da es sich um eine lokale Variable handelt. Hilft das? –

+0

Danke Ned, ja, das ist mein Verständnis über warten (der Thread wird freigegeben), also was Sie sagen, ist stringVariable ist sicher in dem oben genannten Kontext und wird immer korrekt für den Thread, in dem es verwendet wurde? (nicht auf einen anderen Thread von einem anderen Benutzer angewendet) – AdrianSean

+0

ja, das ist korrekt –

Antwort

1

Der Compiler erstellt eine Zustandsmaschine für async Methoden, die für jeden Thread, der die Methode ausführt, separat initialisiert wird. Daher hat jeder Anfrage-Thread seinen eigenen Zustandsautomaten und der Thread selbst wird erst freigegeben, wenn die await-Anweisung ausgeführt wird.

Jede Anfrage hat auch ihre eigene stringVaraible, da es sich um eine lokale Variable handelt, die nicht von anderen Threads betroffen ist.

+0

cool cool .. so die Zustandsmaschine speichert alle lokalen Variablen in dieser Bedeutung das nächste Mal, wenn der Thread aufgerufen wird (nachdem es freigegeben wird) ist alles intakt – AdrianSean