0
我正在寫一個客戶端/服務器應用程序,我試圖從包含無限循環的線程更新UI,以執行Socket.Receive。當我在套接字上收到數據包時,我必須更新UI並繼續循環。問題是線程無法管理UI,所以我試圖在線程中調用BeginInvoke,但結果是UI凍結了。是否有一個簡單的過程,允許調用線程內的BeginInvoke並將控制權返回給UI?如何從線程更新WPF應用程序中的UI?
我正在寫一個客戶端/服務器應用程序,我試圖從包含無限循環的線程更新UI,以執行Socket.Receive。當我在套接字上收到數據包時,我必須更新UI並繼續循環。問題是線程無法管理UI,所以我試圖在線程中調用BeginInvoke,但結果是UI凍結了。是否有一個簡單的過程,允許調用線程內的BeginInvoke並將控制權返回給UI?如何從線程更新WPF應用程序中的UI?
使用阻塞調用來更新主線程上的UI。這樣,線程將等待更新完成,然後繼續。你在以非阻塞異步方式調用,這可能導致主線程氾濫,這就是爲什麼它凍結。
System.Windows.Application.Current.Dispatcher.Invoke(delegate{
// update UI
});
我可以在單獨的線程而不是主線程中做到這一點嗎? –
您可以隨時從任何線程調用。基本上只需將此代碼複製粘貼到您的線程循環中並更新委託內部的UI。而已。 – GregaMohorko