ExecutionContext of Threads - c #, multihilo, threadcontext

¿Cuál es el propósito de ExecutionContext.SuppressFlow();? En el siguiente código ¿Qué es exactamente suprimido?

Tengo este código de prueba ...

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/>";
}
}
}
}

Respuestas

8 para la respuesta № 1

Los detalles de ExecutionContext son muy oscuros, ocultos en funciones como .NET Remoting y WCF. Lo que es parte de esto es:

  • HttpExecutionContext
  • IllogicalCallContext, un repositorio de datos específicos de subprocesos utilizados por Remoting
  • LogicalContext, como arriba
  • SecurityContext
  • SynchronizationContext

CultureInfo no es parte de eso, que puede ser unProblema considerable si cambia la cultura predeterminada de su hilo principal. No hay una buena manera de asegurarse de que otros hilos se ejecuten con esa cultura a menos que escriba explícitamente el código para cambiarlos. Eso no siempre es práctico, dado que .NET es apto para ejecutar devoluciones de llamada asincrónicas en subprocesos de subprocesos. Se inicializarán en la cultura predeterminada del sistema.

Editar: este problema se corrigió en .NET 4.5 con la propiedad CultureInfo.DefaultThreadCurrentCulture.

Edit2: corregido mucho más a fondo en .NET 4.6, la cultura ahora fluye como se esperaba.


6 para la respuesta № 2

ExcecutionContext.SuppressFlow suprime el flujo del contexto de ejecución a través de subprocesos asincrónicos.

los ExecutionContext, se pasan implícitamente desde el hilo padre alniño uno, proporciona información relevante para un hilo lógico de ejecución: contexto de seguridad, contexto de llamada y contexto de sincronización. Si esa información no es imperativa, la omisión del contexto de ejecución optimiza un poco el rendimiento de una aplicación de multihilo.

ExecutionContext.RestoreFlow restablece el paso del contexto de ejecución entre hilos.

Finalmente

Q: En el siguiente código, ¿qué es exactamente suprimido?

UN: Exactamente se suprime el paso de la siguiente información: contexto de seguridad, contexto de llamada y contexto de sincronización; entre los hilos recién creados. Por qué eso fue hacer? -Para optimizar la creación y el trabajo de th.Length hilos creados: se pasa menos información suplementaria entre los hilos, más rápido interactúa el hilo entre ellos.


1 para la respuesta № 3

No es la respuesta a tu pregunta, pero ya que eresAl mirar este código y tratar de entenderlo en este momento, compruebe si desea adaptar / cambiar su código de acuerdo con la documentación (es decir, "corregirlo"):

ExecutionContext.SuppressFlow:

Debe usar el método Deshacer en la estructura AsyncFlowControl devuelta para restaurar el flujo de ExecutionContext.

ExecutionContext.RestoreFlow:

RestoreFlow revierte el efecto de una llamada previa al método SuppressFlow.

Este método es llamado por el método Deshacer de la estructura AsyncFlowControl devuelto por el método SuppressFlow. Debe usar el método Deshacer para restaurar el flujo del contexto de ejecución, no el método RestoreFlow.

Énfasis mío


1 para la respuesta № 4

Leí esto: "Cuando se crea un hilo, elel tiempo de ejecución garantiza que el contexto de ejecución del subproceso iniciador fluye al nuevo subproceso. De esta forma, el nuevo hilo tiene los mismos privilegios que el hilo padre. Sin embargo, esta copia de datos cuesta algunos recursos. Si no necesita estos datos, puede deshabilitar este comportamiento utilizando el método ExecutionContext.SuppressFlow ".

Fuente: Programación en C # Exam 70-483. Autor: Wouter de Kort


0 para la respuesta № 5

Cuando se crea un hilo, el tiempo de ejecución garantizaque el contexto de ejecución del subproceso iniciador fluye al nuevo subproceso. De esta forma, el nuevo hilo tiene los mismos privilegios que el hilo padre. Sin embargo, esta copia de datos cuesta algunos recursos. Si no necesita estos datos, puede deshabilitar este comportamiento utilizando el método ExecutionContext.SuppressFlow.


Menú