简体   繁体   English

使用BackgroundWorker时WPF UI无法更新

[英]WPF UI not updating while using BackgroundWorker

I am developing WPF Client application that communicates with Server over TCP/IP using sockets. 我正在开发WPF客户端应用程序,该应用程序TCP/IP using sockets.通过TCP/IP using sockets.与服务器进行通信TCP/IP using sockets. I have multiple WPF forms and I connect to the server as soon as the application loaded 我有多个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");
    }
}

I used BackgroundWorker to continuously updating UI by the data it received from Server. 我使用BackgroundWorker通过从服务器接收的数据不断更新UI。 But unfortunately UI does not updated automatically, however when the form is reloaded eg by switching back and forth between forms,the UI gets updated itself b/c of following load event 但不幸的是,UI不会自动更新,但是当重新加载表单时(例如,通过在表单之间来回切换),UI在随后的加载事件中自行更新。

private void Mimic_Loaded(object sender, RoutedEventArgs e)
{
   MyWorker.RunWorkerAsync();
} 

Please let me know, how my UI will automatically gets updated as soon as the application received data from server through sockets. 请让我知道,一旦应用程序通过套接字从服务器接收数据,我的UI将如何自动更新。 Data() function does communication with server. Data()函数与服务器进行通信。

C# WPF Client Application 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 
    }
}

try Dispatcher.Invoke to update UI thread after your socket call 在套接字调用后尝试Dispatcher.Invoke更新UI线程

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM