2010-05-09 24 views
6

He estado leyendo los artículos en MSDN, pero mi mente está muerta (esto suele suceder cuando leo MSDN (sin ofender MSDN, pero sus artículos me confunden a veces.)), Y estoy tratando de hacer un poco de "trabajo de fondo" en mi aplicación, pero no estoy seguro de cómo. Es solo un solo método. Pero la aplicación se cuelga, y tengo que esperar hasta 1 - 3 minutos para que se convierta ... ¿sin cambiar?Aplicaciones multiproceso

¿Hay algún ejemplo simple que esté rondando en línea en algún lugar que pueda ver y jugar?

Gracias a todos

+1

¿realiza llamadas directas a controles de formulario desde el hilo de fondo? – volody

+0

Me disculpo, volody. Este es mi primer intento de multihilo. Nunca he necesitado multihilo en el pasado. –

+1

@volody; Ahora entiendo lo que querías decir con tu pregunta. Nop. No planeo hacer llamadas para formar controles desde un hilo de fondo. :) –

Respuesta

0

Ya hay this decent question con muchos enlaces a artículos que son más fácilmente digeribles que MSDN.

El artículo de Jon Skeet es el más fácil y probablemente el más completo para empezar, y la serie de Joe Duffy entra en mucha profundidad. Navegar por las etiquetas C# & Multithreading en Stackoverflow también le brinda algunas buenas respuestas.

Usted puede encontrar evitando la BackgroundWorker la forma más rápida de ponerse en marcha, y sólo tiene que utilizar una invocación:

void ButtonClick(object sender,EventArgs e) 
{ 
    Thread thread = new Thread(Worker); 
    thread.Start(); 
} 

void Worker() 
{ 
    if (InvokeRequired) 
    { 
     Invoke(new Action(Worker)); 
     return; 
    } 

    MyLabel.Text = "Done item x"; 
} 

algunas personas les gusta usar el BackgroundWorker en Stackoverflow, otros no (estoy en el campo Número 2).

+1

¡Guau, esto parece sorprendentemente simple! Y el código que estoy usando para realizar la operación ... ¿Acabo de poner eso en algún lugar dentro del método Worker()? PD ¡Gracias! :) –

+0

@ j-t-s En cualquier lugar después de 'InvokeRequired', que solo está ahí para cambiar al hilo de la interfaz de usuario para que pueda actualizar sus controles sin obtener una excepción. –

+0

Ojalá pudiera votar esto dos veces –

4

Jon Skeet escribió un buen introduction to multithreading in .NET que se puede leer. También cubre threading in WinForms. Puede ir entre las líneas:

public partial class Form1 : Form 
{ 
    private BackgroundWorker _worker; 

    public Form1() 
    { 
     InitializeComponent(); 
     _worker = new BackgroundWorker(); 
     _worker.DoWork += (sender, e) => 
     { 
      // do some work here and calculate a result 
      e.Result = "This is the result of the calculation"; 
     }; 
     _worker.RunWorkerCompleted += (sender, e) => 
     { 
      // the background work completed, we may no 
      // present the result to the GUI if no exception 
      // was thrown in the DoWork method 
      if (e.Error != null) 
      { 
       label1.Text = (string)e.Result; 
      } 
     }; 
     _worker.RunWorkerAsync(); 
    } 
} 
+1

Gracias Darin, todavía estaba leyendo los artículos de Jon Skeet que mencionaste. Muy interesante y útil. Gracias por escribir una muestra para mí :) ¡Es muy apreciada! Lo estoy probando ahora. :-) –

0

Darin ya te contó la teoría.

Pero debe verificar el método estático ThreadPool.QueueUserWorkItem. Es mas conveniente