2012-01-14 24 views

Odpowiedz

36

Nie tylko oczekuje się, że ThreadStart będzie nieważne, ale także nie będzie przyjmować żadnych argumentów! Możesz zawinąć go w lambdę, anonimowy delegat lub nazwaną funkcję statyczną.

Oto jeden sposób to zrobić:

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

Oto kolejny składnia:

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

Trzeci składnia (o nazwie funkcji) jest najbardziej nudny:

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

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

Jest to pomocne dla mnie. Dziękuję Ci. –

+0

Nie mogłem uzyskać wartości zwracanej. Jak korzystać z wartości zwracanej? –

+1

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

3

Powinieneś używać do tego celu Task.

0

Jeśli można użyć dowolnej metody gwintowania, spróbuj 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; 
} 
Powiązane problemy