2012-01-14 22 views

risposta

36

Non solo ThreadStart aspettarsi metodi vuoti, ma si aspettano anche loro di non prendere alcun argomento! Puoi avvolgerlo in un lambda, un delegato anonimo o una funzione statica denominata.

Ecco un modo per farlo:

string res = null; 
Thread newThread = new Thread(() => {res = sayHello("world!");}); 
newThread.Start(); 
newThread.Join(1000); 
Console.Writeline(res); 

Ecco un altro sintassi:

Thread newThread = new Thread(delegate() {sayHello("world!");}); 
newThread.Start(); 

La terza sintassi (con una funzione denominata) è la più noiosa:

// Define a "wrapper" function 
static void WrapSayHello() { 
    sayHello("world!); 
} 

// Call it from some other place 
Thread newThread = new Thread(WrapSayHello); 
newThread.Start(); 
+0

E 'stato utile per me. Grazie. –

+0

Non è stato possibile ottenere il valore restituito. Come si può usare il valore di ritorno? –

+1

[ParameterizedThreadStart Delegato] (http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx) –

3

Si deve usare un Task a tale scopo.

0

Se è possibile utilizzare qualsiasi metodo di filettatura, provare BackgroundWorker:

BackgroundWorker bw = new BackgroundWorker(); 
public Form1() 
{ 
    InitializeComponent(); 

    bw.DoWork += bw_DoWork; 
    bw.RunWorkerCompleted += bw_RunWorkerCompleted; 
    bw.RunWorkerAsync("MyName"); 
} 

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    Text = (string)e.Result; 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string name = (string)e.Argument; 
    e.Result = "Hello ," + name; 
} 
Problemi correlati