2011-01-24 13 views
5

Tengo una aplicación web y en el código detrás de la página, tengo un evento de clic de botón.C# Threading Issue en una aplicación web

protected void btnUpload_Click(object sender, EventArgs e) 
     { 
      TimerEvent TE = new TimerEvent(); 
      TE.TimerEvents(); 
      Server.Transfer("~/Jobs.aspx"); 
     } 

Estoy teniendo un TimerEvents llamada al método() y puede tomar 10-15 segundos para obtener el control de nuevo a la transferencia del servidor. así que quiero que la línea de transferencia del servidor se ejecute simultáneamente al mismo tiempo que la llamada al método.

me trataron como en el roscado aquí:

TimerEvent TE = new TimerEvent(); 
    Thread t = new Thread(TE.TimerEvents); 
    t.IsBackground = true; 
    t.Start();   
    Server.Transfer("~/Jobs.aspx"); 

Pero la transferencia no se hace, hasta que se termine el método. ¿Cómo puedo lograr esto?

+0

Si el método está tomando tiempo, entonces la optimización debería estar en el método. Al crear el hilo, el método no volverá más rápido. ¿Es posible pegar el código del método? – Jagannath

+0

Se supone que el método sondeará una carpeta para buscar nuevos archivos (se colocarán nuevos archivos en esa carpeta después del procesamiento del archivo de entrada que estoy cargando en esa carpeta), por lo que el procesamiento puede tardar de 10 a 15 segundos y no se puede optimizar (Es un archivo matlab y necesita tiempo de procesamiento). Y no puedo hacer que el usuario espere entre 10 y 15 segundos. de ahí el problema. – superstar

Respuesta

4

Este diseño no es ideal. Incluso si lo hace bien, existe la posibilidad de que encuentre problemas en el camino debido a la mezcla de código multi-threading y la llamada Server.Transfer().

También hay problemas con respecto a multi-threading en aplicaciones ASP.NET.

Le sugiero que vuelva a diseñar su aplicación para que tenga algún tipo de cola que ponga en cola las tareas de larga ejecución. Luego puede tener un servicio que procesa las tareas en la cola una por una.

Desde su aplicación web, ahora será capaz de:

  1. cola de la larga tarea TimerEvents funcionamiento con el servicio externo.

  2. llamada Server.Transfer()

  3. En la nueva página ("~/Jobs.aspx"), llame al servicio externo para recoger sus resultados cuando lo necesite.

+0

Veo tu punto. ¿Puedes elaborar sobre la cola y el servicio externo con cualquier referencia para lograr lo mismo? Gracias – superstar

+0

En realidad, comencé a gustarme la idea que proponías. Cualquier elaboración sobre esto será muy útil para mí. Gracias. – superstar

+0

La idea es que el servicio externo sondeará una ubicación de almacenamiento donde se pueden realizar solicitudes. La mayoría de los desarrolladores simplemente usan una tabla de base de datos que tiene un request_id, request_date, estado y columnas de solicitud. Sin embargo, lo mismo se puede lograr guardando archivos XML en el disco o usando MSMQ. El servicio sondea la ubicación de almacenamiento, procesa la solicitud y publica los resultados y luego pasa a la siguiente solicitud. La persona que llama en un momento posterior, puede verificar el * área de resultados * (o simplemente la columna de estado en la tabla de DB) para obtener el resultado de la solicitud. – tenor

0

Si el proceso se repite de una manera similar a menudo, lo que podríamos llamar un "evento aplicación" por qué no CONFIGURACIÓN un proceso en un hilo sperate del archivo Global.asax (aplicación). Puede usar la clase FileWatcher para monitorear el directorio y procesar los archivos secuencialmente o lanzando otro proceso en su propio hilo para cada archivo a medida que llegan, puede persistir un estado y cualquier resultado y exponer esto al cliente posiblemente usando un tiempo AJAX llamar de vuelta.

Recuerde manejar todas las excepciones correctamente en los métodos llamados desde el archivo Global.asax ya que pueden hacer que todo el dominio de la aplicación descienda.

Global.asax

0

cosa más fácil de hacer: me acaba de regresar de inmediato y decir "Eres archivo se ha cargado", pero luego hacer un refrescante automática en su página 'jobs.aspx' y mostrar el estado de cada puesto de trabajo como "procesamiento" hasta que ha "hecho"

asumiendo jobs.aspx es una lista de los trabajos de procesamiento ... y que 'actualización automática' no es demasiado janky :)