Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 高响应多线程WPF应用程序_C#_Wpf_Multithreading_Backgroundworker - Fatal编程技术网

C# 高响应多线程WPF应用程序

C# 高响应多线程WPF应用程序,c#,wpf,multithreading,backgroundworker,C#,Wpf,Multithreading,Backgroundworker,我正在开发WPF应用程序,通过串口与16台设备进行通信。通信过程包括读写命令。配置设备大约需要2分钟。我的UI在配置过程中应该是响应性的,它应该在执行读取命令后显示读取,并在执行写入命令后显示命令状态。我使用backgroundworker处理一台设备。一切正常。现在我需要同时运行所有16台设备。我该怎么做?由于只有一个UI线程可用,2-3个设备的UI挂起。请建议最好的方法。您必须为每个设备配备后台工作程序, 您可以通过以下方式报告每个设备的进度: backgroundWorker1.DoWor

我正在开发WPF应用程序,通过串口与16台设备进行通信。通信过程包括读写命令。配置设备大约需要2分钟。我的UI在配置过程中应该是响应性的,它应该在执行读取命令后显示读取,并在执行写入命令后显示命令状态。我使用backgroundworker处理一台设备。一切正常。现在我需要同时运行所有16台设备。我该怎么做?由于只有一个UI线程可用,2-3个设备的UI挂起。请建议最好的方法。

您必须为每个设备配备后台工作程序, 您可以通过以下方式报告每个设备的进度:

backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.ProgressChanged +=backgroundWorker1_ProgressChanged;

   private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
     {
       ....
       backgroundWorker1.ReportProgress(i);
       ....
     }

  private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
       progressBar1.Value = e.ProgressPercentage;
    }
您还可以使用以下命令从任何线程与UI线程交互:

Application.Current.Dispatcher.BeginInvoke
( DispatcherPriority.Normal,new Action(() => { ... }));

“因为只有UI线程可用”-这是什么意思?为什么不为所有16台设备使用
BackgroundWorkers
?对不起,我的意思是只有一个UI线程。所有设备都要执行相同的操作。所以我创建了用户控件,在一个窗口中加载16个用户控件,并在后台工作程序中执行完整的设备通信。但在交流过程中,我也需要更新用户界面。你是怎么通信的?通过串口。我可以详细说明你的问题,我可以回答更多的细节。你是如何与用户界面沟通的?