2010-05-11 18 views
5

Voglio passare una funzione che accetta un parametro per il Costruttore ThreadStart in C#. Ma, sembra che questo non è possibile, come ottengo un errore di sintassi che io cerco di fare qualcosa di similepassare parametri a un thread

Thread t1 = new Thread(new ThreadStart(func1(obj1)); 

dove obj1 è un oggetto di tipo List<string> (diciamo).

Se voglio che un thread esegua questa funzione che accetta un oggetto come parametro, e ho intenzione di creare 2 tali thread contemporaneamente con diversi valori di parametro qual è il metodo migliore per ottenere questo risultato?

+1

Quale versione di .NET stai usando? –

+0

Wow! Ho fatto questo prima creando una classe per contenere i dati che il thread userà, ma non avevo idea che ci fossero così tanti modi diversi per rivestire questo animale! –

risposta

7

È necessario ParametrizedThreadStart passare un parametro a un thread.

Thread t1 = new Thread(new ParametrizedThreadStart(func1); 
t1.Start(obj1); 
+0

Grazie mille .. questo metodo funziona ..tuttavia, la definizione di func1 in questo caso dovrà essere void func1 (stato dell'oggetto) e non può essere void func1 (Lista obj1) perché è questo il caso? – assassin

+0

Ecco come viene definito il tipo delegato 'ParametrizedThreadStart'. Dovrai restituire 'object' a' List 'dentro' func1'. – Thomas

13

Se si sta utilizzando .NET 3.5 o superiore, una possibilità è quella di utilizzare un lambda per questo:

var myThread = new System.Threading.Thread(() => func1(obj1)); 
+0

Grazie mille !!! – assassin

3

Prova questo:

var bar = 0.0; 
Thread t = new Thread(() => 
    { 
     Foo(bar); 
    }); 
t.IsBackground = true; 
t.Start(); 

o nel vostro caso:

Object obj1 = new Object(); 
Thread t = new Thread(() => 
    { 
     func1(obj1); 
    }); 
t.IsBackground = true; 
t.Start(); 
7

È possibile iniziare una nuova discussione in questo modo:

Thread thread = new Thread(delegate() { 
    // Code here. 
}); 
thread.Start(); 

All'interno dello anonymous method è possibile accedere alle variabili che erano incluse nell'ambito della creazione del delegato.

3

Modifica assassino ha avuto problemi a trovare il codice a lavorare, quindi ho incluso un'applicazione completa esempio console alla fine di questo post.

 


{ // some code 
    Thread t1 = new Thread(MyThreadStart); 
    t1.Start(theList); 
} 

void MyThreadStart(object state) 
{ 
    List<string> theList = (List<string>)state; 
    //.. 
} 

 

Questo è il mio edit: Qui di seguito è una console app completa - la tecnica funziona davvero:

 

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Threading.Thread t = new System.Threading.Thread(MyThreadStart); 
      t.Start("Hello"); 
      System.Console.ReadLine(); 
     } 


     static void MyThreadStart(object state) 
     { 
      System.Console.WriteLine((string)state); 
     } 
    } 
} 

 
+0

Questo non funziona .. l'ho provato ... il metodo ParametrizedThreadStart suggerito da Thomas funziona. – assassin

+0

@assassin ti assicuro, funziona. Ho modificato la mia voce per includere un'app console che è possibile incollare direttamente in Visual Studio ed eseguire. Questa sintassi ha funzionato da .Net 2.0 e se si sostituisce "new Thread (MyThreadStart)" con "new Thread (nuovo delegato) – JMarsch

3

È questo l'effetto che stai cercando?

 static void Main(string[] args) 
    { 
     var list = new List<string>(){ 
      "a","b","c" 
     }; 

     Thread t1 = new Thread(new ParameterizedThreadStart(DoWork)); 

     t1.Start(list); 

     Console.ReadLine(); 

    } 

    public static void DoWork(object stuff) 
    { 
     foreach (var item in stuff as List<string>) 
     { 
      Console.WriteLine(item); 
     } 
    } 
1
static void func1(object parameter) 
{ 
    // Do stuff here. 
} 

static void Main(string[] args) 
{ 
    List<string> obj1 = new List<string>(); 
    Thread t1 = new Thread(func1); 
    t1.Start(obj1); 
} 

che sta utilizzando un nuovo delegato in .Net 2.0 chiamato ParameterizedThreadStart. Puoi leggere su di esso here.

0

È assolutamente necessario utilizzare un oggetto Thread? O stai solo cercando l'elaborazione multithreaded per accadere? Un approccio più "moderna" sarebbe quella di utilizzare un delegato asincrono come tale:

private delegate void FuncDelegate(object obj1); 
. 
. 
. 
FuncDelegate func = func1; 
IAsyncResult result = func.BeginInvoke(obj1, Completed, func); 

// do other stuff 
. 
. 
. 

private void Completed(IAsyncResult result) 
{ 
    ((FuncDelegate)result.AsyncState).EndInvoke(result); 

    // do other cleanup 
} 

Un altro metodo ancora "moderna" sarebbe usare Tasks nel NET 4 TPL.