2011-11-04 21 views
27

Estoy buscando una forma de llamar a un método en un nuevo hilo (usando C#). por ejemplo, me gustaría llamar al SecondFoo() en un nuevo hilo. Sin embargo, me gustaría que el hilo termine cuando finalice SecondFoo().C# Llamar a un método en un nuevo hilo

He visto varios ejemplos de subprocesamiento en C#, pero ninguno que se aplique a este escenario específico; donde necesito que el hilo generado termine solo. es posible?

¿Cómo puedo forzar que el subproceso generado ejecutando Secondfoo() finalice al finalizar?

¿Alguien ha encontrado algún ejemplo de esto ???

Muchas gracias, Brett

+3

Cuando Secondfoo() vuelve, el subproceso en el que se ejecuta finalizará. ¿Por qué crees que no? –

+0

¿Hay alguna razón por la cual no puedes usar ThreadPool? –

Respuesta

61

Si realmente se inicia un nuevo hilo, el hilo se terminará cuando el método termina:

Thread thread = new Thread(SecondFoo); 
thread.Start(); 

Ahora SecondFoo serán llamados en el nuevo hilo, y el hilo terminará cuando se complete.

Quizás quiso realidad quiere decir que usted quería que el hilo se terminará cuando el método en el llamando rosca completa?

EDITAR: Tenga en cuenta que iniciar un hilo es una operación bastante costosa. ¿Definitivamente necesita una marca nueva hilo en lugar de utilizar un hilo de subprocesamiento? Considere usar ThreadPool.QueueUserWorkItem o (preferiblemente, si usa .NET 4) TaskFactory.StartNew.

+1

Esto es :-) No sabía que un hilo termina cuando ya no hay más sentencias para ejecutar. Así que esta es la respuesta exacta que estaba necesitando. ¡¡¡Muchas gracias!!! – Brett

41

¿Realmente tiene que ser un hilo, o puede ser una tarea también?

si es así, lo más fácil es:

Task.Factory.StartNew(() => SecondFoo()) 
+0

o simplemente 'Task.Run' – Omu

1

A menos que tenga una situación especial que requiere un hilo no hilos de la piscina, sólo tiene que utilizar un hilo grupo de subprocesos como esto:

Action secondFooAsync = new Action(SecondFoo); 

secondFooAsync.BeginInvoke(new AsyncCallback(result => 
     { 
     (result.AsyncState as Action).EndInvoke(result); 

     }), secondFooAsync); 

Garantiza que EndInvoke está llamado a hacerse cargo de la limpieza.

+0

He usado beginInvoke antes para ejecutar un informe de procesamiento largo en un nuevo hilo. Aquí hay un artículo de MSDN en BeginInvoke: http://msdn.microsoft.com/en-us/library/2e08f6yc%28v=vs.71%29.aspx – William

+3

Es más fácil llamar a 'ThreadPool.QueueUserWorkItem' ... –

-2

Por lo que tengo entendido que necesita terminar significa Thread.Abort() ¿verdad? En este caso, puede simplemente salir de Foo(). O puede usar Process para atrapar el hilo. ejemplo

Thread myThread = new Thread(DoWork); 

myThread.Abort(); 

myThread.Start(); 

proceso:

using System; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Threading; 
using Microsoft.VisualBasic; 

class PrintProcessClass 
{ 

    private Process myProcess = new Process(); 
    private int elapsedTime; 
    private bool eventHandled; 

    // Print a file with any known extension. 
    public void PrintDoc(string fileName) 
    { 

     elapsedTime = 0; 
     eventHandled = false; 

     try 
     { 
      // Start a process to print a file and raise an event when done. 
      myProcess.StartInfo.FileName = fileName; 
      myProcess.StartInfo.Verb = "Print"; 
      myProcess.StartInfo.CreateNoWindow = true; 
      myProcess.EnableRaisingEvents = true; 
      myProcess.Exited += new EventHandler(myProcess_Exited); 
      myProcess.Start(); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("An error occurred trying to print \"{0}\":" + "\n" + ex.Message, fileName); 
      return; 
     } 

     // Wait for Exited event, but not more than 30 seconds. 
     const int SLEEP_AMOUNT = 100; 
     while (!eventHandled) 
     { 
      elapsedTime += SLEEP_AMOUNT; 
      if (elapsedTime > 30000) 
      { 
       break; 
      } 
      Thread.Sleep(SLEEP_AMOUNT); 
     } 
    } 

    // Handle Exited event and display process information. 
    private void myProcess_Exited(object sender, System.EventArgs e) 
    { 

     eventHandled = true; 
     Console.WriteLine("Exit time: {0}\r\n" + 
      "Exit code: {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime); 
    } 

    public static void Main(string[] args) 
    { 

     // Verify that an argument has been entered. 
     if (args.Length <= 0) 
     { 
      Console.WriteLine("Enter a file name."); 
      return; 
     } 

     // Create the process and print the document. 
     PrintProcessClass myPrintProcess = new PrintProcessClass(); 
     myPrintProcess.PrintDoc(args[0]); 
    } 
} 
4

En .Net Hilos son gestionados por grupo de subprocesos por lo que sólo puede iniciarlo y olvidarse de él! Considera este código.

new Thread(new ThreadStart(SecondFoo)).Start(); 
Cuestiones relacionadas