C# 设计gui,如何从变量集合中更新多个控件

C# 设计gui,如何从变量集合中更新多个控件,c#,wpf,winforms,C#,Wpf,Winforms,我已经为一台制造机器开发gui(或HMI)大约一年了。 机器中大约有5000个参数,gui需要读取访问 目前,我有一个守护进程线程从机器上收集所有变量,作为机器上的两个大数据块,并将它们解析出来,放在gui上的列表中 我收集、更新和解析所有小于40ms的内容,这是低于1秒所需的更新频率,所以我认为这个工作很好。 问题是如何在实际的gui中更新控件。因为我只能在创建控件的同一线程上更新该控件。Im目前使用不同的线程在所有控件之间循环,然后使用BeginInvoke(winform)或Dispatc

我已经为一台制造机器开发gui(或HMI)大约一年了。 机器中大约有5000个参数,gui需要读取访问

目前,我有一个守护进程线程从机器上收集所有变量,作为机器上的两个大数据块,并将它们解析出来,放在gui上的列表中

我收集、更新和解析所有小于40ms的内容,这是低于1秒所需的更新频率,所以我认为这个工作很好。

问题是如何在实际的gui中更新控件。因为我只能在创建控件的同一线程上更新该控件。Im目前使用不同的线程在所有控件之间循环,然后使用BeginInvoke(winform)或Dispatcher(wpf)为用户更新所有内容。我觉得这太复杂了

有没有人做过类似的事情,或者有更优雅的方式更新gui


谢谢

尝试使用BackgroundWorker


在DoWork事件中,收集数据并使用ReportProgress功能将其分块传递,或者在结果中一次性传递。它省去了使用Invoke的需要。

在另一种替代线程方法中

在构造函数中定义此代码

     RunAsynchroneWork(new DoWorkEventHandler(RestartOnLoaded), new    RunWorkerCompletedEventHandler(RestartOnLoaded_Completed));
并将以下代码写入相关位置

 //AsynchroneWorker 
    public void RunAsynchroneWork(DoWorkEventHandler workHandler, RunWorkerCompletedEventHandler workCompletedHandler = null)
    {
        BackgroundWorker backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += workHandler;
        if (workCompletedHandler != null) backgroundWorker.RunWorkerCompleted += workCompletedHandler;
        backgroundWorker.RunWorkerAsync();
    }

   public void RestartOnLoaded(object sender, DoWorkEventArgs e)
    {

    //DO SOMETHING HERE   

    }


    public void RestartOnLoaded_Completed(object sender, RunWorkerCompletedEventArgs e)
    {
      //DO SOMETHING HERE ( after completion of RestartOnLoaded ) 
    }

您可以使用ListView触发事件,该事件执行添加项、将文本框更新到列表的工作,如下例所示。您只需在全局范围中添加变量,以便任何backgroundworker和UpdateUiEvent都可以访问它们

ListViewItem _listViewItem;

private void BackgroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
    //your loop to get list view item
    _listViewItem = new ListViewItem(mytext) {tag = mytagobject);
    _listViewItem.SubItems.Add(mysubitemtext);
    Invoke(new EventHandler(UpdateUiEvent), new[] { sender, e });
}

void UpdateUiEvent(object sender, EventArgs e)
{
    listView1.Items.Add(_listViewItem);
}

如果我在结果处理程序中输入太多,UI是否会变得无响应?这取决于UI需要多少时间用这些数据更新自身。为了提高性能,可以删除所有格式,使用轻型控件并暂停绘制,直到完成更新控件。看这里: