2012-06-20 130 views
0

我开始编程一个月只有几前,所以我是一个纯粹的初学者 但我需要用重型概率计算数学的应用程序,并查看/互动所以我搜索了一圈,发现C#.NET是最好的方法的UI ......梦幻般的力量......异步UI更新

这会帮助我很多,如果我能做到这一点进步:

与文本WPF窗口,在文本框中一些在每次计算完成的时间,但打印

我试着使用最新做的UI响应应该每次净4.5因为应用程序需要快速(所以使用最新的技术,而不是定时器或后台任务

它的工作,但用户界面卡住,无法移动(因为我的访问不好的文本框我认为)

如果你们能帮助我,这将是伟大的,我感谢你们,因为我学到了很多与你的讯息!

这里是我的错新手卡

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(); 
       } 
         ) 
      ); 
    } 
} 

回答

4

你tightlooping,诚然在非UI线程,但加入了bazillion代表援引 UI线程...所以你的用户界面太忙了。

全部您的工作基本上是在UI线程中进行的 - 您甚至不在后台线程中计算rng.NextDouble()

另外请注意,你有一个async方法没有await表达,这应该引起编译器警告 - 你应该采取的是谨慎。

你说你不想使用“背景任务” - 但这正是你通过调用Task.Run所做的

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

+0

也许我misspoke我只是不想使用旧的后台任务和计时器在旧窗口窗体中可用,以获得新的4.5框架的所有权力 计算代码应运行在一个单独的线程比Ui 和每一个新的号码可用时将其发送到不应该被卡住 代码仅仅是一个CSV下载(一个线程)的用户界面和计算 – analystLp

+0

@analystLp:如果您已经在一个单独的线程中运行的计算代码,那么我不确定异步/等待是否真的是你需要的。只要你使用'Dispatcher.Invoke',你应该已经很好了 - 如果你不像样本那样重载UI线程。 –

+0

好吧然后我会继续学习如何创建一个真正的后台计算线程发送号码与调度员谢谢! – analystLp