可能性のある複製:
Thread.Start()のデリゲート関数からの戻り値にアクセス
public string sayHello(string name)
{
return "Hello ,"+ name;
}
このメソッドをスレッドでどのように使用できますか?
そのThreadStartメソッドはvoidメソッドを受け入れるだけです。
あなたの助けを待っています。ありがとうございました。
ThreadStart
はvoidメソッドを期待するだけでなく、引数を取らないことも期待します!ラムダ、匿名デリゲート、または名前付き静的関数でラップできます。
これを行う1つの方法を次に示します。
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();
そのためには Task を使用する必要があります。
スレッド化の方法を使用できる場合は、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;
}