2017-09-19 1 views
2

ich eine Website haben, gibt es ein Verfahren wie folgt aus:Wie kann ich den aktuellen Thread in einer Methode identifizieren?

public Context GetContext() 
{ 
... 
} 

Diese Methode mehrmals aufgerufen wird, wenn ein Benutzer-Login auf der Website, und die Methode einige Informationen zurück.

Jetzt habe ich einen anderen Thread von der Website starten, wird der Thread etwas tun. Und im Thread-Job wird diese Methode auch mehrmals aufgerufen.

Das Problem ist, in diesen beiden Situationen sollte die Methode unterschiedliche Ergebnis zurückgeben, aus irgendeinem Grund kann ich keine andere Methode verwenden oder Parameter zu der Methode hinzufügen.

Gibt es trotzdem den aktuellen Thread in einer Methode zu identifizieren? Grundsätzlich möchte ich so etwas archivieren:

var thread = new Thread(GetContext); 
thread.SomeFlag = True. 
thread.Start() 

public Context GetContext() 
{ 
    Var thread = GetCurrentThread(); 
    If(thread.SomeFlag == True) 
     //do some thing... 
    Else 
     //do some thing... 
} 

Ist das möglich?

+1

Versuchen Sie 'System.Threading.Thread.CurrentThread.ManagedThreadId'. – Enigmativity

+5

Explizit das Ausführen anderer Threads innerhalb einer asp.net-Anwendung ist fast immer die falsche Lösung für ein wahrgenommenes Problem. Wenn wir wüssten, welches * Problem * Sie mit diesem anderen Thread lösen wollten, können wir vielleicht anständige Lösungen anbieten. –

+0

@Damien_The_Unbeliever ist es dort kann sowieso vermeiden, andere Threads zum Ausführen einer Hintergrundaufgabe in asp.net laufen zu lassen? – jarvanJiang

Antwort

2

Sie können ThreadStaticAttribute verwenden, um den Wert eines Felds für jeden Thread einzeln festzulegen. Sie setzen den Wert zu Beginn jedes Threads (Sie es nicht außerhalb des Threads einstellen) und bewerten es im Bereich:

[ThreadStatic] 
private static bool someFlag; 

var thread = new Thread(GetContext); 
thread.Start() 

public Context GetContext() 
{ 
    someFlag = true; 
    //... 
    if(someFlag == true) 
     //do some thing... 
    else 
     //do some thing... 
} 

Dass Sie beliebige Daten für jeden Thread zu speichern. Im Gegensatz zu einer Thread-ID haben Sie die vollständige Kontrolle über die Daten, die Sie speichern möchten.

+1

Da 'someFlag' statisch ist, macht' thread.SomeFlag' keinen Sinn. –

+0

Hört sich gut an. Nur eine Frage: Ist dieses Attributverhalten in verschiedenen Klassen gleich? z.B. setze diese threadstatic Variable in eine andere Klasse (kann statisch sein oder nicht). – jarvanJiang

+0

@JakobChristensen: Da someFlag das ThreadStatic-Attribut angewendet hat, wird pro Thread ein eindeutiges statisches Flag erstellt: siehe https://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx – PaulF

Verwandte Themen