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

由于您使用的是 .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;
    }
于 2012-01-21T21:44:43.987 回答
1

不,这不是一个好习惯。

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

在这种情况下,您可以让任务本身执行 Invoke(),或使用延续。

但是代码看起来很人为,可能会发布更接近您真正问题的内容。

于 2012-01-21T20:45:55.983 回答