草庐IT

C# Winform ProgressBar 和 BackgroundWorker

coder 2024-05-21 原文

我有以下问题:

我有一个名为 MainForm 的表单。我有一个很长的手术要在这张表格上进行。

在这个漫长的操作过程中,我需要在 MainForm 之上显示另一个名为 ProgressForm 的操作。

ProgressForm 包含一个进度条,需要在长时间操作发生时更新。

长操作完成后,ProgressForm应该自动关闭。

我写了下面的代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ClassLibrary
{
    public class MyClass
    {
        public static string LongOperation()
        {
            Thread.Sleep(new TimeSpan(0,0,30));

            return "HelloWorld";
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BackgroungWorker__HelloWorld
{
    public partial class ProgressForm : Form
    {
        public ProgressForm()
        {
            InitializeComponent();
        }

        public ProgressBar ProgressBar
        {
            get { return this.progressBar1; }
            set { this.progressBar1 = value; }
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using ClassLibrary;

namespace BackgroungWorker__HelloWorld
{
    public partial class MainForm : Form
    {
        ProgressForm f = new ProgressForm();

        public MainForm()
        {
            InitializeComponent();  
        }

        int count = 0;
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (f != null)
            {
                f.ProgressBar.Value = e.ProgressPercentage;
            }

            ++count;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled) 
            {  
                MessageBox.Show("The task has been cancelled");  
            }  
            else if (e.Error != null)  
            {                  
                MessageBox.Show("Error. Details: " + (e.Error as Exception).ToString());  
            }  
            else 
            {  
                MessageBox.Show("The task has been completed. Results: " + e.Result.ToString());  
            }
        }


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (f == null)
            {
                f = new ProgressForm();
            }

            f.ShowDialog();

            //backgroundWorker1.ReportProgress(100);

            MyClass.LongOperation();

            f.Close();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();

            this.Close();
        }
    }
}

我找不到更新 progressBar 的方法。

我应该在哪里放置 backgroundWorker1.ReportProgress() 以及我应该如何调用它?

我不能在 MyClass 中做任何更改,因为我不知道会发生什么,也不知道在我的应用程序的这一层完成操作需要多长时间。

谁能帮帮我?

最佳答案

一个问题是您要睡 30 秒。通常,您会在长时间运行的任务中的不同点调用 ReportProgress。因此,为了演示这一点,您可能希望将代码更改为休眠 1 秒,但 30 次 - 每次完成休眠时调用 ReportProgress

另一个问题是您正在显示 ProgressForm 来自 后台线程。您应该在 UI 线程中启动它,但将后台工作人员的 ProgressChanged 事件挂接到它。然后当后台工作人员报告进度时,会更新进度表。

关于C# Winform ProgressBar 和 BackgroundWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1470927/

有关C# Winform ProgressBar 和 BackgroundWorker的更多相关文章

  1. c# - 未找到 BackgroundWorker - 2

    我在WindowsPhone8.1中使用System.componentmodel引用来获取BackgroundWorker但每次我放置BackgroundWorker时它都会给我错误CS0246找不到类型或命名空间名称“BackgroundWorker”(是否缺少using指令或程序集引用?)HealthBandC:\Users\husam\Desktop\Projects\HealthBand\HealthBand\ConnectionManager.cs16我尝试添加引用,但它说它已经添加当我把usingSystem.ComponentModel;它说using指令是不必要的这是

  2. c# - BackGroundworker 取消不适用于 wbadmin.exe - 2

    好的,我正在使用:带有Windows窗体的C#我有一个后台工作,它可以工作。现在我想创建一个取消按钮,但即使我告诉它取消并且后台接受了它,它仍会继续运行它触发的可执行文件。我有一个带有以下代码的取消按钮privatevoidcancelBackup_Click(objectsender,EventArgse){backgroundWorker1.CancelAsync();displayResults.Text="OperationCancelled";}后台工作代码在这里:privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkE

  3. windows - 在没有 "Cross Threading"的情况下,我可以从 BackgroundWorker 访问什么? - 2

    我意识到我无法从BackgroundWorker的DoWork事件处理程序访问表单控件。(如果我尝试这样做,我会得到一个异常,正如预期的那样)。但是,我可以访问存在于我的表单上的其他(自定义)对象吗?例如,我创建了一个“设置”类并在我的表单中实例化了它,我似乎能够读取和写入它的属性。这只是运气好吗?如果我有一个静态类怎么办?我可以安全地访问它吗? 最佳答案 @英格拉姆:您已经了解了它的要点-CrossThreadCalls只是MS放入.NETFramework中的一个很好的功能,用于防止“笨蛋”类型的并行编程错误。它可以被覆盖,正如

  4. .net - BackgroundWorker:一旦 DoWork() 事件处理程序完成,它就死了吗? - 2

    我要说的是,一旦您使用DoWork()处理程序完成工作,然后可能执行RunWorkerCompleted(),您能否重新调用RunWorkerAsync()并让它重新进入DoWork()处理程序,还是您需要再做一次"new"操作并创建一个新的BackgroundWorker?只是想知道在这些事情发生之后是否进行了任何处理或其他清理,现在您不再有可行的bgworker。 最佳答案 您可以随心所欲地调用RunWorkerAsync。您不需要创建新的BackgroundWorker对象。唯一的限制是您不能在BackgroundWorker

  5. c# - BackgroundWorker 异常处理 - 2

    我正在使用以下组件:一个库(抛出异常)用于测试我的日志记录的测试控制台企业图书馆异常处理应用程序block企业图书馆日志应用程序block我正在使用后台工作程序调用库方法。该库抛出异常,但从未调用RunWorkerCompleted处理程序。捕获异常的唯一方法是用try/catchblock包围我的DoWork处理程序代码。是否误解了RunWorkerCompletedEventArgs.Error属性?不是为了获取被BackgroundWorker捕获的异常吗?代码示例:staticBackgroundWorkerw=newBackgroundWorker();w.DoWork+=n

  6. c# - 在 BackGroundWorker 中运行方法并显示 ProgressBar - 2

    我想要的是,当某些方法正在执行某些任务时,UI会保持自身处于事件状态,并且我想在进度条中显示工作进度。我有一个方法,一个BackGroundWorker和一个Progressbar。我想在BackGroundWorker开始运行时调用该方法并显示进度。该方法包含一个循环。因此,它可以报告进度。那么,可以做什么呢?privatevoidForm1_Load(objectsender,EventArgse){//TODO:Thislineofcodeloadsdataintothe'dataSet1.TBLMARKET'table.Youcanmove,orremoveit,asneede

  7. c# - 您能否链接到使用 BackgroundWorker 而不将其作为组件放置在表单上的一个很好的示例? - 2

    我记得很多年前(2005年)我在我的代码中使用了BackgroundWorker而没有为它使用可视化组件,但我不记得如何(不幸的是我非常健忘,并且在我停止后很快就忘记了一切使用它)。也许我正在扩展BackgroundWorker类。您能否链接到一个以这种方式使用BackgroundWorker的好示例? 最佳答案 This文章清楚地解释了您需要的一切。HerearetheminimumstepsinusingBackgroundWorker:InstantiateBackgroundWorkerandhandletheDoWorke

  8. C# backgroundWorker 报告字符串? - 2

    我如何从backgroundWorker向我的windows.form报告一个字符串(如“正在搜索文件......”,“找到选择......”)以及一个百分比。此外,我有一个大类,其中包含我想在backgroundWorker_Work中运行的方法。我可以通过Class_method()来调用它;但是我无法报告我的完成百分比或被调用类的任何内容,只能通过backgroundWorker_Work方法。谢谢! 最佳答案 我假设WCF也有这个方法publicvoidReportProgress(intpercentProgress,Ob

  9. c# - 如何在 C# backgroundworker progressed changed 事件中发送更多参数 - 2

    我明白我们如何将一个变量(progresspercentage)传递给“progresschanged”函数,就像这样。backgroundWorker1.ProgressChanged+=newProgressChangedEventHandler(backgroundWorker1_ProgressChanged);...worker.ReportProgress(pc);...privatevoidbackgroundWorker1_ProgressChanged(objectsender,ProgressChangedEventArgse){this.progressBar1.

  10. c# - BackgroundWorker & Timer,只读取日志文件的新行? - 2

    我的应用程序写入一个日志文件(当前使用log4net)。我想设置一个计时器和一个后台worker来读取日志文件并将其内容打印到我的表单中的某个控件中,同时它正在被写入。我不能使用FileSystemWatcher类,因为它似乎损坏了:有时事件“更改”会触发,有时不会。而且它的“池化率”极低。所以我创建了一个Timer和一个FileSystemWatcher。在计时器的“滴答”事件中,后台工作人员执行其工作。问题是:如何只读取自worker上次检查后添加的行?publicLogForm(){InitializeComponent();logWatcherTimer.Start();}pr

随机推荐