Csharp/C#教程:在任务运行时以另一种forms更新进度条分享


在任务运行时以另一种forms更新进度条

**最终,我将同时运行四个任务,并有另一个包含四个进度条的表单。 我想让每个进度条更新,因为它的工作任务正在完成。

这就是我要为初学者做的事情。

我有一个表格上有一些按钮。 当我点击一个我正在创建一个新任务来做一些工作。

public partial class MyMainForm : Form { private void btn_doWork_Click(object sender, EventArgs e) { Task task = new Task(RunComparisons); task.Start(); } private void RunComparisons() { int progressBarValue = 0; MyProgressBarForm pBar = new MyProgressBarForm(maxValue, "some text"); pBar.ShowDialog(); foreach(string s in nodeCollection) { //do some work here progressBarValue++; pBar.updateProgressBar(progressBarValue, "some new text"); } pBar.BeginInvoke(new Action(() => pBar.Close())); } } 

在另一个包含带进度条的表单的类中:

 public partial class MyProgressBarForm : Form { public MyProgressBarForm(int maxValue, string textToDisplay) { InitializeComponent(); MyProgressBarControl.Maximum = maxValue; myLabel.Text = textToDisplay; } public void updateProgressBar(int progress, string updatedTextToDisplay) { MyProgressBarForm.BeginInvoke( new Action(() => { MyProgressBarControl.Value = progress; myLabel.Text = updatedTextToDisplay; })); } 

当我单击“执行”按钮时,将显示进度条表单但不会更新。 它只是坐在那里挂起。 如果我注释掉pBar.ShowDialog(); 然后进度条表单不显示,但要完成的工作完全运行完成。

当我创建自己的线程时,我完成了这项工作,但我读到了有关任务的内容,现在我正试图让它以这种方式运行。 我哪里做错了?

在父窗体的主UI线程上创建进度条窗体,然后在按钮单击事件中调用对象上的Show()方法。

这是一个有2个条形的例子:

 //In parent form ... private MyProgressBarForm progressBarForm = new MyProgressBarForm(); private void button1_Click(object sender, EventArgs e) { progressBarForm.Show(); Task task = new Task(RunComparisons); task.Start(); } private void RunComparisons() { for (int i = 1; i < 100; i++) { System.Threading.Thread.Sleep(50); progressBarForm.UpdateProgressBar(1, i); } } //In MyProgressBarForm ... public void UpdateProgressBar(int index, int value) { this.Invoke((MethodInvoker) delegate{ if (index == 1) { progressBar1.Value = value; } else { progressBar2.Value = value; } }); } 

TPL添加了IProgress接口,用于通过长时间运行的非UI操作的进度来更新UI。

您需要做的就是在UI中创建一个Progress实例,其中包含如何使用progress更新它的说明,然后将其传递给可以通过它报告进度的worker。

 public partial class MyMainForm : System.Windows.Forms.Form { private async void btn_doWork_Click(object sender, EventArgs e) { MyProgressBarForm progressForm = new MyProgressBarForm(); progressForm.Show(); Progress progress = new Progress(); progress.ProgressChanged += (_, text) => progressForm.updateProgressBar(text); await Task.Run(() => RunComparisons(progress)); progressForm.Close(); } private void RunComparisons(IProgress progress) { foreach (var s in nodeCollection) { Process(s); progress.Report("hello world"); } } } public partial class MyProgressBarForm : System.Windows.Forms.Form { public void updateProgressBar(string updatedTextToDisplay) { MyProgressBarControl.Value++; myLabel.Text = updatedTextToDisplay; } } 

这使得Progress Form处理显示UI的进度,工作代码只处理执行工作,主要表单只需创建进度表单,启动工作,并在完成后关闭表单,它将完成所有工作跟踪进度和通过UI线程进行marhsaling Progress 。 它还避免了多个UI线程; 您当前从非UI线程创建和操作UI组件的方法会产生许多问题,这些问题会使代码复杂化并使其难以维护。

.ShowDialog是一个阻塞调用; 在对话框返回结果之前,执行将不会继续。 您应该查看BackgroundWorker以处理另一个线程上的工作并更新对话框。

上述就是C#学习教程:在任务运行时以另一种forms更新进度条分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1009658.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐