2009-12-23 5 views
7

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

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

Respuesta

8

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

  • HostExecutionContext
  • IllogicalCallContext, un repositorio de datos de hilo específico utilizado por Remoting
  • LogicalContext, como arriba
  • SecurityContext
  • SynchronizationContext

CultureInfo no es parte de esto, lo que puede ser un problema considerable si cambias tu m ain cultura predeterminada del hilo. No hay una buena manera de garantizar que otros subprocesos 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: se arregló mucho más a fondo en .NET 4.6, la cultura ahora fluye como se esperaba.

+0

Está escrito en el libro de la Fundación de Desarrollo de Aplicaciones que, "Por defecto, el contexto de ejecución fluye a hilos auxiliares, pero lo hace a un costo. Si desea detener el flujo de información de contexto (aumentando el rendimiento pero perdiendo la seguridad actual, CULTURA y la información de contexto de transacción), puede usar la clase ExecutionContext. ", ** @ nobugz: ** ¿Podría explicar esto amablemente? –

+0

* Cultura * significa información como el idioma actual del subproceso, moneda o representación numérica, etc. – serhio

+0

** @ serhio: ** Sí y esto está contenido en CultureInfo, por lo que significa que si suprimimos y cambiamos la cultura no se obtendrá reenviado a los hilos que se crean en este ámbito? y si no suprimimos, ¿pasará por los hilos de ayuda? Sin embargo, en el código anterior, ya sea que suprima o no, la cultura de los hilos es siempre en-EE. UU., Que es la máquina predeterminada. –

6

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

El ExecutionContext, se pasan de forma implícita a partir de hilos padre para el niño uno, proporciona información relevante para un hilo lógico de ejecución: contexto de seguridad, el contexto de llamadas y de 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 restaura el paso del contexto de ejecución entre subprocesos.

Finalmente

Q: En el siguiente código obtiene exactamente lo que suprime ??

A: Exactamente se suprimen el paso de la siguiente información: contexto de seguridad, llame contexto y de contexto de sincronización; entre los hilos recién creados. ¿Por qué que se hizo? -Para optimizar la creación y el trabajo de th.Length subprocesos creados: menos información suplementaria pasada entre subprocesos: más rápido, estos subprocesos interactúan entre ellos.

+0

Bueno, mi Q no fue exactamente esta ... Esta es una especie de jerga técnica que tenemos que leer en cada artículo. He presentado un código anterior y con respecto a eso quería que me aclararan qué fue exactamente suprimido en el código anterior. –

+0

@S M Karman: ver mi edición. – serhio

1

No es la respuesta a su pregunta, pero ya que está mirando este código y trata de entenderlo ahora, compruebe si desea adaptar/cambiar el código de acuerdo con la documentación (es decir, "corregirlo") :

ExecutionContext.SuppressFlow:

debe utilizar el método Deshacer en la estructura AsyncFlowControl vuelto a restaurar el flujo de la ExecutionContext.

ExecutionContext.RestoreFlow:

RestoreFlow invierte el efecto de una llamada de método SuppressFlow anterior.

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.

+0

** @ Benjamin Podszun: ** ExecutionContext.RestoreFlow; también es válido Aunque se prefiere Deshacer ... –

1

Leí esto: "Cuando se crea un subproceso, el tiempo de ejecución garantiza que el contexto de ejecución del subproceso iniciador se transfiere al nuevo subproceso. De esta manera, el nuevo subproceso tiene los mismos privilegios que el subproceso principal" Esta copia de datos cuesta algunos recursos, sin embargo. 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

Llamarás a ExecutionContext.SuppressFlow() para mejorar el rendimiento reduciendo el tiempo de ejecución de la aplicación ya que la llamada al método evitará copiar datos de contexto del hilo padre al hilo secundario que de lo contrario afectaría o aumentaría el tiempo de ejecución cuando no se requiera los datos de contexto del subproceso principal en el subproceso secundario. –

0

Cuando se crea un subproceso, el 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.