1

タスクを作成し、タスクが完了するのを待つスレッドを割り当ててから、UI を変更します。

 string txt = txtHelloMessage.Text;
 HelloTask = Task<string>.Factory.StartNew(
            () =>
            {
                string msg = client.SayHello(txt);
                return msg;
            }
            );
 new Thread(
           () =>
            {
                while (true)// waiting for completion, I think that this is wrong
                {
                    if (HelloTask.IsCompleted)
                    {
                        this.Dispatcher.Invoke((Action)delegate() { txtHelloMessage.Text = HelloTask.Result; });
                        break;

                    }
                }

            }
            ).Start();

これは良い習慣ですか?

4

2 に答える 2

2

await.NET 4.5 / C# 5 を使用しているため、キーワードを使用できます。これは本当にばかげた、単純な例です。

    private async void button1_Click(object sender, EventArgs e)
    {
        await GetSomeTextForSomeReason();
    }

    private async Task GetSomeTextForSomeReason()
    {
        var s = await Task.Factory.StartNew(() =>
                                  {
                                      for (int i = 0; i < 500000000; i++) ; // simulate a delay
                                      return "This is text";
                                  });
        textBox1.Text = s;
    }
于 2012-01-21T21:44:43.987 に答える
1

いいえ、それは良い習慣ではありません。

軽量 (安価) のタスクの結果を処理するために、非常に重くて高価なスレッドを使用しています。

この場合、タスク自体に Invoke() を実行させるか、継続を使用することができます。

しかし、コードは非常に人工的に見えます。おそらく、実際の問題に近いものを投稿してください。

于 2012-01-21T20:45:55.983 に答える