ExecutionContext von Threads - c #, Multithreading, threadcontext

Was ist der Zweck von ExecutionContext.SuppressFlow();? Im folgenden Code was genau wird unterdrückt?

Ich habe diesen Testcode ...

protected void btnSubmit_Click(object sender, EventArgs e)
{
Thread[] th = new Thread[100];
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");

AsyncFlowControl cntrl = ExecutionContext.SuppressFlow();
for (int i = 0; i < th.Length; i++)
{
th[i] = new Thread(new ParameterizedThreadStart(ThreadMethod));
th[i].Name = "Thread #" + (i+1).ToString();
th[i].Start((i+1).ToString());
}
ExecutionContext.RestoreFlow();

foreach (Thread t in th)
{
t.Join();
}
Response.Write(response);
}


String response = null;
Random rnd = new Random(1000);
private void ThreadMethod(object param)
{
if (param != null)
{
string temp = param as string;
if (temp != null)
{
//To test what is the current culture I get for this thread execution
System.Globalization.CultureInfo info = Thread.CurrentThread.CurrentCulture;
for (int i = 0; i <= 10; i++)
{
Thread.Sleep(rnd.Next(2000));
response += Thread.CurrentThread.ManagedThreadId.ToString() + ":"
+ Thread.CurrentThread.Name + ": " + temp + "<br/>";
}
}
}
}

Antworten:

8 für die Antwort № 1

Die Details von ExecutionContext sind sehr dunkel, tief verborgen in Features wie .NET Remoting und WCF. Was dazu gehört ist:

  • HttpExecutionContext
  • IllogicalCallContext, ein Repository mit threadspezifischen Daten, die von Remoting verwendet werden
  • LogicalContext, wie oben
  • Sicherheitskontext
  • Synchronisierungskontext

CultureInfo ist nicht Teil davon, was ein sein kannerhebliches Problem, wenn Sie die Standardkultur Ihres Hauptthreads ändern. Es gibt keinen guten Weg, sicherzustellen, dass andere Threads mit dieser Kultur laufen, wenn Sie nicht explizit den Code schreiben, um sie zu wechseln. Das ist nicht immer praktisch, da .NET dazu geeignet ist Async-Callbacks für Threadpool-Threads ausführen Sie werden mit der Standardkultur des Systems initialisiert.

Bearbeiten: Dieses Problem wurde in .NET 4.5 mit der CultureInfo.DefaultThreadCurrentCulture-Eigenschaft behoben.

Edit2: viel besser in .NET 4.6 behoben, Kultur fließt jetzt wie erwartet.


6 für die Antwort № 2

ExcecutionContext.SuppressFlow unterdrückt den Ablauf des Ausführungskontexts über asynchrone Threads hinweg.

Das Ausführungskontext, werden implizit vom übergeordneten Thread an die übergebenchild one, stellt Informationen bereit, die für einen logischen Ausführungsthread relevant sind: Sicherheitskontext, Aufrufkontext und Synchronisationskontext. Wenn diese Information nicht zwingend ist, optimiert das Weglassen des Ausführungskontexts ein wenig die Leistung einer Multithreading-Anwendung.

Ausführungskontext.WiederherstellenFlow Stellt die Passage des Ausführungskontexts zwischen Threads wieder her.

Endlich

Q: Im folgenden Code was genau unterdrückt wird ??

EIN: Genau sind die Weitergabe der folgenden Informationen unterdrückt: Sicherheitskontext, Aufrufkontext und Synchronisationskontext; zwischen den neu erstellten Threads. Warum das war's? -Um die Erstellung und die Arbeit von zu optimieren die Länge erstellte Threads: weniger zusätzliche Informationen, die zwischen Threads übergeben werden - schneller, wenn diese Threads zwischen ihnen interagieren.


1 für die Antwort № 3

Nicht die Antwort auf deine Frage, aber da du es bistSchauen Sie sich diesen Code an und versuchen Sie ihn jetzt zu verstehen, bitte überprüfen Sie, ob Sie Ihren Code gemäß der Dokumentation anpassen / ändern möchten (d. h. "reparieren"):

ExecutionContext.SuppressFlow:

Sie müssen die Undo-Methode für die zurückgegebene AsyncFlowControl-Struktur verwenden, um den Ablauf des ExecutionContext wiederherzustellen.

ExecutionContext.RestoreFlow:

RestoreFlow kehrt die Wirkung eines vorherigen SuppressFlow-Methodenaufrufs um.

Diese Methode wird von der Undo-Methode der AsyncFlowControl-Struktur aufgerufen, die von der SuppressFlow-Methode zurückgegeben wird. Sie sollten die Undo-Methode verwenden, um den Ablauf des Ausführungskontexts wiederherzustellen, nicht die RestoreFlow-Methode.

Schwerpunkt meiner.


1 für die Antwort № 4

Ich lese das - "Wenn ein Thread erstellt wird, derRuntime stellt sicher, dass der Ausführungskontext des initiierenden Threads in den neuen Thread geflossen ist. Auf diese Weise hat der neue Thread die gleichen Berechtigungen wie der übergeordnete Thread. Dieses Kopieren von Daten kostet jedoch einige Ressourcen. Wenn Sie diese Daten nicht benötigen, können Sie dieses Verhalten mithilfe der ExecutionContext.SuppressFlow-Methode deaktivieren. "

Quelle: Programmieren in C # Exam 70-483. Autor: Wouter de Kort


0 für die Antwort № 5

Wenn ein Thread erstellt wird, stellt die Laufzeit sicherdass der Ausführungskontext des initiierenden Threads in den neuen Thread geflossen ist. Auf diese Weise hat der neue Thread die gleichen Berechtigungen wie der übergeordnete Thread. Dieses Kopieren von Daten kostet jedoch einige Ressourcen. Wenn Sie diese Daten nicht benötigen, können Sie dieses Verhalten mithilfe der ExecutionContext.SuppressFlow-Methode deaktivieren.


Speisekarte