gpt4 book ai didi

C# Winform ProgressBar 和 BackgroundWorker

转载 作者:可可西里 更新时间:2023-11-01 07:46:01 28 4
gpt4 key购买 nike

我有以下问题:

我有一个名为 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com