2015-09-26 150 views
-1

我有一個WPF UI,我想通過調用某些事件異步更新它從另一個線程。異步更新wpf UI從另一個線程異步

我知道如何調用事件並在UI線程中調用它們,但我想做它異步。

public partial class HomeUI 
{ 
    public HomeUI() 
    { 
     var test = new LogicClass(); 
     test.UI_StartPlaying += StartPlaying; 

     new Thread(test.Start).Start(); 
    } 

    private void StartPlaying(object sender, EventArgs e) 
    { 
     Dispatcher.Invoke(new Action(() => 
     { 
      var streamAddress = (e as UIUpdateEventArgs).StreamAddress; 
      vlc.Stop(); 
      vlc.Media = new LocationMedia(streamAddress); 
      vlc.Play(); 
     })); 
    } 

} 


public class LogicClass 
{ 
    public event EventHandler UI_StartPlaying; 
    public void Start() 
    { 
     DoSomethings(); 
     UI_StartPlaying(this, new UIUpdateEventArgs(streamAddress)); 
     DoSomethingElse(); 
    } 
} 

class UIUpdateEventArgs : EventArgs 
{ 
    string StreamAddress {get; set;} 
    public UIUpdateEventArgs(string streamAddress) 
    { 
     this.StreamNumber = streamNumber; 
    } 
} 

,但在這段代碼,當東西DoSomethingElse()一部分導致延遲或停止邏輯線程發生,UI凍結。
編輯:DoSomethingElse()部分,我運行了2個線程,其中一個執行所有數據庫事務並且有一些延遲。這個延遲使得vlc在用戶界面上暫停(凍結一個隨機幀),然後使整個UI凍結。
顯然,當我評論這些交易時,程序正常工作。
我該怎麼做才能使UIEventUpdate與我的Logic Thread異步運行?

+1

_當某件事發生在DoSomethingElse()部分,導致延遲或停止邏輯thread_它不應該,因爲DoSomethingElse運行在一個線程上。 '東西'需要解釋。 –

+0

我們需要了解您如何運行Db交易。 –

+0

我知道所有的數據庫事務都可以寫得更好,但是我想要防止UI凍結或者其他任何原因。如何在UI上播放流,而不依賴於程序的其他部分。 – aisa

回答

2

你可以使用Dispatcher.BeginInvoke來得到你所需要的。這個函數直接返回,委託被調度並在以後調用。

如果您的要求是DoSomethingElse()StartPlaying完成後調用,您必須致電awaitDispatcher.BeginInvoke

我不知道LocationMedia但如果new LocationMedia(streamAddress);是一種昂貴的創建(需要很長的和/或需要的內存很多)如果可能的話我會做的Dispatcher委託外面。

var streamAddress = (e as UIUpdateEventArgs).StreamAddress; 
var media = new LocationMedia(streamAddress); 
Dispatcher.BeginInvoke(new Action(() => 
{ 
    vlc.Stop(); 
    vlc.Media = media; 
    vlc.Play(); 
})); 

問候!