【问题标题】:Improving Task code to achieve async await改进Task代码以实现异步等待
【发布时间】:2012-01-21 20:27:56
【问题描述】:

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

这是好的做法吗?

【问题讨论】:

    标签: c# multithreading async-await task


    【解决方案1】:

    由于您使用的是 .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;
        }
    

    【讨论】:

    • 我使用的是 C# 4.5 而不是 .Net 4.5
    • @sleimanjneidi 没有 C# 4.5。 C# 的最新发布版本是 4.0。 C# 5.0 将与 Visual Studio 11 一起发布。
    【解决方案2】:

    不,这不是一个好习惯。

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

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

    但是代码看起来很人为,也许贴一些更接近你真正问题的东西。

    【讨论】:

    • 是的,这只是一个示例。我正在寻找第二部分的更好实践(等待结果)
    • 等待结果还是处理结果?
    • 等待结果再处理(while(true){..})这部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2017-08-19
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多