2014-09-03 72 views
-2

通常,當有人想要執行一些長時間運行的任務並向UI報告其進度時,在更新UI時,長時間運行的任務將在新線程中調用。 我希望做一個更舒適的方式,是這樣的:WPF - 從不同線程更新主窗口

MainWindow.SetWatingMsg("please wait ..."); 

doLongRunnnigTask(); 

MainWindow.RemoveWaitingMsg(); 

因此,在這種情況下出現的用戶界面在不同的線程從長期運行的任務正在運行一個更新。 我試過這個,在我的主窗口中,我有一個帶有進度條動畫的隱藏視框。在我的應用我有我的主窗口中的引用,所以我的計劃是要具備以下功能,我可以從不同的地方在我的代碼中調用:

public void SetWaitMsg(string msg) 
{ 
    if (Session.User != null) 
     if (Session.User.Configuration.DontShowWaitMsg) 
      return; 

    Task.Factory.StartNew(() => 
    { 
     AppMainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Render, (System.Action)delegate() 
     { 
      AppMainWindow.pleaseWaitBox.Visibility = Visibility.Visible; 
     }); 
    }); 
} 

public void RemoveWaitMsg() 
{ 
    Task.Factory.StartNew(() => 
    { 
     AppMainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Render, (System.Action)delegate() { AppMainWindow.pleaseWaitBox.Visibility = Visibility.Collapsed; }); 
    }); 
} 

的問題是,這只是不工作,我得到沒有錯誤,只是沒有更新。 UI更新的唯一時間是在調用set和刪除函數之間打開一個確認彈出窗口。

幫助將不勝感激。

感謝

+0

你只調用後臺線程來更新UI消息。這沒有意義。 – 2014-09-03 10:20:03

回答

0

這是更好地去除Task.Factory.StartNew()。但我認爲這應該不重要。這似乎是你正在UI線程上執行長時間運行的任務。我的意思是,爲了允許WPF播放動畫,您需要在並行線程上執行您的操作,同時UI線程將播放您的動畫。

所以,這個代碼是從任何線程設置等待消息:

public void SetWaitMsg(string msg) 
{ 
    if (Session.User != null) 
     if (Session.User.Configuration.DontShowWaitMsg) 
      return; 

    AppMainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Render, (System.Action)delegate() 
    { 
     AppMainWindow.pleaseWaitBox.Visibility = Visibility.Visible; 
    }); 
} 

public void RemoveWaitMsg() 
{ 
    AppMainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Render, (System.Action)delegate() { AppMainWindow.pleaseWaitBox.Visibility = Visibility.Collapsed; }); 
} 

但由於尤瓦幫我意識到,我們不知道,如果你正在做正確的後臺任務。所以,假設你在UI線程上面執行代碼,你的實際代碼應該是這樣的:

MainWindow.SetWatingMsg("please wait ..."); 

Task.Factory.StartNew(() => doLongRunnnigTask()); 

MainWindow.RemoveWaitingMsg(); 


public void SetWaitMsg(string msg) 
{ 
    if (Session.User != null && Session.User.Configuration.DontShowWaitMsg) 
      return; 

    AppMainWindow.pleaseWaitBox.Visibility = Visibility.Visible; 
} 

public void RemoveWaitMsg() 
{ 
    AppMainWindow.pleaseWaitBox.Visibility = Visibility.Collapsed; 
} 
+0

如果您在主線程上,則無需使用Dispatchet.BeginInvoke。 – 2014-09-03 10:21:02

+0

@YuvalItzchakov noone肯定知道他是否在UI線程上運行這個方法。他給我們的代碼太少了。 – 2014-09-03 10:24:57

+0

比你不能在你的答案中假設他不是。 – 2014-09-03 10:34:38