web-dev-qa-db-ja.com

C#スレッドメソッドは値を返しますか?

可能性のある複製:
Thread.Start()のデリゲート関数からの戻り値にアクセス

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

このメソッドをスレッドでどのように使用できますか?

そのThreadStartメソッドはvoidメソッドを受け入れるだけです。

あなたの助けを待っています。ありがとうございました。

19
Ogan Tabanlı

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();
38
dasblinkenlight

そのためには Task を使用する必要があります。

3
Jonathan Allen

スレッド化の方法を使用できる場合は、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;
}
0
ispiro