簡體   English   中英

使用BackgroundWorker時WPF UI無法更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM