【问题标题】:Async /Await Only Multithreading?仅异步/等待多线程?
【发布时间】:2014-02-27 12:09:39
【问题描述】:

我尝试使用 c# 的 TPL 异步执行一个简单的代码。但不是在一个单独的线程中!我只想使用主线程,我希望我的 WPF 应用程序不会冻结。

这样,我不使用 Task.Run 或 Task.Factory.StartNew 方法(它们创建一个新线程)。我这样做:

    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        var someTask = new Task<List<Person>>(() => CreateList());
        await someTask;
        ListBoxControl.ItemsSource = someTask.Result;
    }

    private List<Person> CreateList()
    {
        var list = new List<Person>();
        list.AddRange(Enumerable.Range(1, 1000000).Select(x => new Person(x)));
        return list;
    }

但是在等待之后,它永远不会返回。我究竟做错了什么?谢谢!

【问题讨论】:

  • 如果你不想在另一个线程上执行操作,你根本不需要asyncawait。只需同步执行所有内容。
  • 1000000 个项目太多了,它会让你的用户感到沮丧。无论如何,我在这里回答了一个类似的问题:stackoverflow.com/a/21592778/1768303.
  • 你为什么要让它在 UI 线程上运行呢?您是否正在尝试解决其他问题?
  • 是的,这是一个简单的例子。
  • @Ziggy,还请考虑一下当用户再次单击ButtonBase 按钮时可能会发生什么,而您仍因上次单击而填充列表框。

标签: c# task-parallel-library async-await


【解决方案1】:

您已创建Task,但尚未启动它。 await 正在等待任务完成,如您所见,在这种情况下它永远不会完成。

由于您不想使用后台线程,我会查看@Noseratio 的评论。

【讨论】:

    【解决方案2】:

    async-await 在 WPF 等客户端 UI 中的一大好处就是可以从 UI 线程中加载非 UI 工作(如 CPU 密集型任务或阻塞 I/O)。

    事实上,这正是您在假设示例中想要的。

    正确使用async-await,你的代码可以像这样简洁:

    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        ListBoxControl.ItemsSource = await Task.Run((Func<List<Person>>)CreateList);
    }
    

    或者,如果您没有在其他任何地方使用 CreateList:

    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        ListBoxControl.ItemsSource = await Task.Run(
            () =>
            {
                var list = new List<Person>();
                list.AddRange(Enumerable.Range(1, 1000000).Select(x => new Person(x)));
                return list;
            }
        );
    }
    

    如果您不需要保留列表:

    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        ListBoxControl.ItemsSource = await Task.Run(
            () => Enumerable.Range(1, 1000000).Select(x => new Person(x))));
    }
    

    您可以阅读以下几篇文章来快速了解async-await

    【讨论】:

      猜你喜欢
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      相关资源
      最近更新 更多