2009-05-01 13 views
28

El método siguiente es lo que quiero hacer en este hilo:Cómo crear un hilo?

public void Startup(int port,string path) 
{ 
    Run(path); 
    CRCCheck2(); 
    CRCCheck1(); 
    InitializeCodeCave((ushort)port); 
} 

Probé lo que pude encontrar buscando en Google, pero nada funcionó

public void Test(int port,string path) 
{ 
    Thread t = new Thread(Startup(port,path)); 
} 

public void TestA(int port,string path) 
{ 
    Thread t = new Thread(Startup); 
    t.Start (port,path); 
} 

Ambos no compile, cómo hacerlo ¿ese?

+1

no funciona o no se compila? – Aziz

+0

Debe especificar el idioma utilizado para que yo (nosotros) no tengamos que adivinar. También diciendo, lo que no funciona sería genial. – tuergeist

+1

Compruebe las etiquetas de pregunta - C# No compila. –

Respuesta

51

Las siguientes maneras funcionan.

// The old way of using ParameterizedThreadStart. This requires a 
// method which takes ONE object as the parameter so you need to 
// encapsulate the parameters inside one object. 
Thread t = new Thread(new ParameterizedThreadStart(StartupA)); 
t.Start(new MyThreadParams(path, port)); 

// You can also use an anonymous delegate to do this. 
Thread t2 = new Thread(delegate() 
{ 
    StartupB(port, path); 
}); 
t2.Start(); 

// Or lambda expressions if you are using C# 3.0 
Thread t3 = new Thread(() => StartupB(port, path)); 
t3.Start(); 

Los métodos de inicio tienen la siguiente firma para estos ejemplos.

public void StartupA(object parameters); 

public void StartupB(int port, string path); 
+1

Aparece el error cuando uso el "método antiguo", pero la expresión lamba funciona perfectamente. :) –

+1

Aclaró las firmas necesarias del método de inicio. –

+0

Bueno, acabo de publicar una respuesta a continuación usando la forma "antigua", pero no me di cuenta de que podría usar expresiones lambda para crear un punto de entrada de hilo más limpio. –

7

El método que desea ejecutar debe ser ThreadStart Delegate. Consulte el Thread documentation en MSDN. Tenga en cuenta que puede ordenar el inicio de dos parámetros con un cierre. Algo como:

var t = new Thread(() => Startup(port, path)); 

Tenga en cuenta que es posible que desee volver a visitar el método de accesibilidad. Si veo una clase que comienza un hilo en su propio método público de esta manera, me sorprenderá un poco.

+0

Intenté esto, no funciona. ThreadStart t = new ThreadStart (Inicio); << Sin sobrecarga para 'Inicio' coincide con delegar 'System.Threading.ThreadStart –

+0

El inicio toma dos parámetros. Si comprueba los documentos que he vinculado, ThreadStart no toma parámetros. Podemos hacer trampa con un cierre para que se vea como dos (en 3.5), o podemos usar ParameterizedThreadStart y agrupar los dos parámetros en un objeto (pre 3.5). –

2
public class ThreadParameter 
     { 
      public int Port { get; set; } 
      public string Path { get; set; } 
     } 


Thread t = new Thread(new ParameterizedThreadStart(Startup)); 
t.Start(new ThreadParameter() { Port = port, Path = path}); 

Cree un objeto con los objetos de puerto y ruta y páselo al método de inicio.

+0

Justo cuando escribo su primera línea, obtengo "No hay sobrecarga para 'Inicio' coincide con delegar 'System.Threading.ParameterizedThreadStart" –

+0

El inicio debe ser "nulo Inicio (parámetros del objeto)". No puede usar "void Startup (parámetros ThreadParameter)" ya que no puede pasar un objeto a ese. Puede convertir los parámetros del objeto a ThreadParameter dentro del Inicio. –

+0

tiene que cambiar la firma del método de inicio para aceptar la clase ThreadParameter ..... (la clase que creó con los 2 parámetros). – CSharpAtl

2

Su ejemplo falla porque los métodos Thread toman uno o cero argumentos. Para crear un hilo sin pasar argumentos, el código es el siguiente:

void Start() 
{ 
    // do stuff 
} 

void Test() 
{ 
    new Thread(new ThreadStart(Start)).Start(); 
} 

Si desea pasar los datos a la rosca, es necesario encapsular los datos en un solo objeto, ya sea una clase personalizada de su propio diseño, o un objeto de diccionario u otra cosa. A continuación, deberá utilizar el ParameterizedThreadStart delegado, así:

void Start(object data) 
{ 
    MyClass myData = (MyClass)myData; 
    // do stuff 
} 

void Test(MyClass data) 
{ 
    new Thread(new ParameterizedThreadStart(Start)).Start(data); 
} 
7

me gusta la fábrica de tareas de System.Threading.Tasks. Se puede hacer algo como esto:

Task.Factory.StartNew(() => 
{ 
    // Whatever code you want in your thread 
}); 

Tenga en cuenta que la fábrica de tareas le da opciones adicionales de conveniencia como ContinueWith:

Task.Factory.StartNew(() => {}).ContinueWith((result) => 
{ 
    // Whatever code should be executed after the newly started thread. 
}); 

También tenga en cuenta que una tarea es un concepto ligeramente diferente a las discusiones. Encajan perfectamente con las palabras clave async/await, consulte here.

Cuestiones relacionadas