2012-01-14 9 views
18

可能性の重複:
Access return value from Thread.Start()'s delegate functionC#スレッドメソッドは値を返しますか?

public string sayHello(string name) 
{ 
    return "Hello ,"+ name; 
} 

どのように私はスレッドで、このメソッドを使用することができますか? ThreadStartメソッドは、単に空のメソッドを受け入れることを

私はあなたのお手伝いをお待ちしています。 ありがとうございます。

答えて

36

だけでなく、ボイド方法をThreadStart期待しない、それはまた、彼らは任意の引数を取らないように期待します!ラムダ、匿名デリゲート、または名前付き静的関数でラップすることができます。ここで

はそれを行うための一つの方法である:ここでは

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

は別の構文は次のとおりです。

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

(命名機能付き)3番目の構文は、最も退屈です:

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

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

それは私のために役立っているです。ありがとうございました。 –

+0

戻り値を取得できませんでした。戻り値はどのように使用できますか? –

+1

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

3

この目的のためにTaskを使用する必要があります。

0

あなたがスレッドのいずれかの方法を使用することができた場合は、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; 
} 
関連する問題