2012-06-20 176 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