改进任务代码以实现异步等待

时间:2012-01-21 20:27:57

标签: c# multithreading async-await task

我正在创建一个任务,然后分配一个等待任务完成的线程,然后修改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();

这是好习惯吗?

2 个答案:

答案 0 :(得分:2)

由于您使用的是.NET 4.5 / C#5,因此可以使用await关键字。这是一个非常愚蠢的简单例子:

    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;
    }

答案 1 :(得分:1)

不,这不是好习惯。

您正在使用非常繁重且昂贵的线程来处理轻量级(廉价)任务的结果。

在这种情况下,您可以让Task本身执行Invoke(),或使用continuation。

但是代码看起来非常人为,可能会发布更贴近您真实问题的内容。