异步UI更新

时间:2012-06-20 12:47:59

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

几个月前我开始编程,所以我是一个纯粹的初学者 但是我需要一个带有重概率计算的数学应用程序和一个用于查看/交互的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(); 
                 }
                          )
              );
    }
}

1 个答案:

答案 0 :(得分:4)

你肯定是在非UI线程中进行了紧缩,但是添加了数以亿计的代表来调用 UI线程中的 ...所以你的用户界面太忙了。

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

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

您说您不想使用“后台任务” - 但这正是您 正在做的事情,只需拨打Task.Run

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