【问题标题】:Async UI update异步 UI 更新
【发布时间】:2013-04-11 21:23:39
【问题描述】:

我几个月前才开始编程,所以我是一个纯粹的初学者 但我需要一个具有高概率计算功能的数学应用程序和一个用于查看/交互的 UI,所以我四处搜索,发现 C#.net 是最好的方法……神奇的力量……

如果我能做到这一点,对我进步有很大帮助:

带有文本框的 Wpf 窗口,每次计算完成时都会在文本框中打印一个数字,但 Ui 应该每次都响应

我尝试使用最新的 net 4.5 来做这件事,因为应用程序需要快速(所以使用最新的技术,而不是计时器或后台任务

它可以工作,但是 Ui 卡住并且无法移动(因为我认为我无法访问文本框)

如果大家可以帮助我,那就太好了,我感谢大家,因为我从你的帖子中学到了很多东西!

这是我错误的新手代码

private Random rng;
public MainWindow()
{
    rng = new Random();
    InitializeComponent();
    Task.Run((Func<Task>) Calc);
}
private async Task Calc()
{
    while (true)
    {
        textBox1.Dispatcher.Invoke
             (DispatcherPriority.Normal
              , new Action(delegate() 
                 { 
                     textBox1.Text = rng.NextDouble().ToString(); 
                 }
                          )
              );
    }
}

【问题讨论】:

    标签: c# wpf .net-4.5 async-await


    【解决方案1】:

    诚然,您在非 UI 线程中进行了紧密循环,但添加了无数的委托来调用 in UI 线程...所以您的 UI 太忙了。

    所有目前您的工作基本上都在 UI 线程中进行 - 您甚至没有在后台线程中计算 rng.NextDouble()

    另请注意,您有一个没有 await 表达式的 async 方法,它应该触发编译器警告 - 您应该注意这一点。

    你说你不想使用“后台任务”——但这正是你正在通过调用Task.Run所做的。

    现在我假设您的 真实 代码实际上并不只需要创建随机数。你的真实计算代码是什么样子的,它发生在哪个线程?

    【讨论】:

    • 也许我说错了我只是不想使用旧 Windows 窗体中可用的旧后台任务和计时器来获得新 4.5 框架的所有功能计算代码应该在单独的线程中运行而不是Ui 并且每次有新号码可用时将其发送到不应卡住的 Ui 代码只是一个 csv 下载(一个线程)和计算
    • @analystLp:如果您已经在单独的线程中运行计算代码,那么我不确定 async/await 是否真的是您需要的。只要您使用Dispatcher.Invoke,您就应该没问题 - 如果您没有像示例那样重载 UI 线程。
    • 好的,那我将继续学习如何创建一个真正的后台计算线程,它会向调度员发送号码,谢谢!
    • 好吧,我想我可以用下面的代码以正确的方式做到这一点,因为 start() 方法有效,而 RunSynchronously() 没有......太糟糕了,我不够好使用现在新的 c#5.0 async 和 await 关键字:p Task task = new Task(new Action(Calc));任务.开始();私有 void Calc() { rng = new Random(); while (true) { textBox1.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() { textBox1.Text = rng.NextDouble().ToString(); })); } }
    • @analystLp:该代码仍然紧密循环。当您向 UI 发送恒定的随机数流时,您如何期望 UI 做任何事情?听起来 async 并不适合您在此处所做的工作,尽管您还没有真正解释清楚自己所做的事情。
    猜你喜欢
    • 2014-02-16
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2018-06-13
    相关资源
    最近更新 更多