[英]WPF UI not updating while using BackgroundWorker
我正在開發WPF
客戶端應用程序,該應用程序TCP/IP using sockets.
通過TCP/IP using sockets.
與服務器進行通信TCP/IP using sockets.
我有多個WPF表單,並且在加載應用程序后就立即連接到服務器
public partial class MainWindow : Window
{
public System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
clientSocket.Connect("127.0.0.1", 8888);
ShowMimic("CCRMain");
}
}
我使用BackgroundWorker
通過從服務器接收的數據不斷更新UI。 但不幸的是,UI不會自動更新,但是當重新加載表單時(例如,通過在表單之間來回切換),UI在隨后的加載事件中自行更新。
private void Mimic_Loaded(object sender, RoutedEventArgs e)
{
MyWorker.RunWorkerAsync();
}
請讓我知道,一旦應用程序通過套接字從服務器接收數據,我的UI將如何自動更新。 Data()
函數與服務器進行通信。
C#WPF客戶端應用程序
BackgroundWorker MyWorker = new BackgroundWorker();
int[] allRodPosition = new int[17];
public CCRMain()
{
InitializeComponent();
MyWorker.DoWork += MyWorker_DoWork;
MyWorker.RunWorkerCompleted += MyWorker_RunWorkerCompleted;
}
private delegate void UpdateMyDelegatedelegate(int i);
private void UpdateMyDelegateLabel(int i)
{
//label1.Content = "BckgroundWork:" + i.ToString();
}
private void MyWorker_DoWork(object Sender, System.ComponentModel.DoWorkEventArgs e)
{
UpdateMyDelegatedelegate UpdateMyDelegate = new UpdateMyDelegatedelegate(UpdateMyDelegateLabel);
DispatcherOperation op = Dispatcher.BeginInvoke((Action)(() =>
{
Data();
A1G1Text.Text = allRodPosition[0].ToString();
}));
}
private void MyWorker_RunWorkerCompleted(object Sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
}
void Data()
{
MainWindow mw = (MainWindow)Application.Current.MainWindow;
NetworkStream serverStream = mw.clientSocket.GetStream();
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(A1G1.Text + "$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, (int)mw.clientSocket.ReceiveBufferSize);
System.IO.MemoryStream ms = new System.IO.MemoryStream(inStream);
System.IO.BinaryReader br = new System.IO.BinaryReader(ms);
int[] inComingData = new int[17];
for (int i = 0; i < 17; i++)
{
inComingData[i] = br.ReadInt32();
allRodPosition[i] = inComingData[i];
}
}
private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
//MainWindow mw = new MainWindow();
MainWindow mw = (MainWindow)Application.Current.MainWindow;
mw.ShowMimic("DemandPosition");
}
private void Button2_MouseDown(object sender, MouseButtonEventArgs e)
{
//MainWindow mw = new MainWindow();
MainWindow mw = (MainWindow)Application.Current.MainWindow;
mw.ShowMimic("LiftCoil");
}
private void Mimic_Loaded(object sender, RoutedEventArgs e)
{
MyWorker.RunWorkerAsync();
}
}
public partial class MainWindow : Window
{
private BackgroundWorker _backgroundWorker;
private Timer timer1;
public MainWindow()
{
InitializeComponent();
_backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += backgroundWorker_DoWork;
_backgroundWorker.RunWorkerAsync();
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
InitTimer();
}
public void InitTimer()
{
timer1 = new Timer();
timer1.Elapsed += Timer1OnElapsed;
timer1.Interval = 2000; // in miliseconds
timer1.Start();
}
private void Timer1OnElapsed(object sender, ElapsedEventArgs e)
{
this.Dispatcher.Invoke(() =>
{
TxtToBeUpdated.Text = DateTime.Now.ToString(CultureInfo.InvariantCulture);
CallSocket();
});
}
private void CallSocket()
{
//do socket
}
}
在套接字調用后嘗試Dispatcher.Invoke更新UI線程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.