c#进度条 在进度条和进度信息提示中执行win

干货达人 头条干货 2020-11-25 09:17:02

在进度条和进度信息提示中执行win

1、方法1:使用线程

功能描述:在使用c#开发WinFrom的过程中。我们通常需要使用进度条(ProgressBar)来显示进度信息。这时,我们可能需要使用多线程。如果不使用多线程控制进度条,则该窗口很容易冻结(无法及时看到进度信息)。下面,我将简要介绍我编写的案例。

第一步:设计接口,注意需要使用System.Threading引用;

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控件的名称为:

progressBar1;标签1; textBox1; button1;

第2步:定义代理以更新ProgressBar(值)的值并在执行方法时返回方法的处理信息。

私人代表无效SetPos(int ipos,string vinfo); //代理

第3步:更新进度条值的功能(参数必须与声明的代理参数相同)

private void SetTextMesssage(int ipos,string vinfo)

{

如果(this.InvokeRequired)

{

SetPos setpos =新的SetPos(SetTextMesssage);

this.Invoke(setpos,new object [] {ipos,vinfo});

}

其他

{

this.label1.Text = ipos.ToString()+“ / 1000”;

this.progressBar1.Value = Convert.ToInt32(ipos);

this.textBox1.AppendText(vinfo);

}

}

第4步:函数实现

private void button1_Click(对象发送者,EventArgs e)

{

线程fThread =新线程(新ThreadStart(SleepT));

fThread.Start();

}

第5步:新的线程执行功能:

private void SleepT()

{

for(int i = 0; i

{

System.Threading.Thread.Sleep(10);

SetTextMesssage(100 * i / 500,i.ToString()+“ \ r \ n”);

}

}

程序操作的效果:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

================================================ ========================================

2、第二种方式:

功能描述:此方法由控件backgroundWorker1的进度条实现。但是进度条是模板形式的。

第一步:主窗体设计:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控件名称:

button1; backgroundWorker1;

对于backgroundWorker1控件,属性设置:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

第2步:主页后台代码:

使用System.Threading; //引用空间名称

private void button1_Click(对象发送者,EventArgs e)

{

this.backgroundWorker1.RunWorkerAsync(); //运行backgroundWorker组件

ProcessForm表单=新的ProcessForm(this.backgroundWorker1); //显示进度条表单

form.ShowDialog(this);

form.Close();

}

private void backgroundWorker1_RunWorkerCompleted(对象发送者,RunWorkerCompletedEventArgs e)

{

如果(e.Error!= null)

{

MessageBox.Show(e.Error.Message);

}

否则(例如已取消)

{

}

其他

{

}

}

//您可以通过这种方式实现调用,方法等。

private void backgroundWorker1_DoWork(对象发送者,DoWorkEventArgs e)

{

BackgroundWorker worker =发送者为BackgroundWorker;

for(int i = 0; i

{

Thread.Sleep(100);

worker.ReportProgress(i);

if(worker.CancellationPending)//如果用户取消,则跳出处理数据代码

{

e.Cancel = true;

休息;

}

}

}

分别为按钮控件和backgroundWorker1控件选择风暴。

第3步:设置子表单(以及显示进度栏的表单):

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控件名称:

progressBar1; button1

第4步:子窗体,背景代码:

private BackgroundWorker backgroundWorker1; // ProcessForm表单风暴(进度条表单)

public ProcessForm(BackgroundWorker backgroundWorker1)

{

InitializeComponent();

this.backgroundWorker1 = backgroundWorker1;

this.backgroundWorker1.ProgressChanged + =新的ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

this.backgroundWorker1.RunWorkerCompleted + =新的RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

}

void backgroundWorker1_RunWorkerCompleted(对象发送者,RunWorkerCompletedEventArgs e)

{

// this.Close(); //执行后,直接关闭页面

}

void backgroundWorker1_ProgressChanged(对象发送者,ProgressChangedEventArgs e)

{

this.progressBar1.Value = e.ProgressPercentage;

}

private void button1_Click(对象发送者,EventArgs e)

{

this.backgroundWorker1.CancelAsync();

this.button1.Enabled = false;

this.Close();

}

}

只需为按钮选择风暴

执行效果是:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

================================================ ===============================================

3、第三种方式:

功能描述:在处理大量数据时,有时该方法的执行需要一定的时间。这时,它经常导致页面或程序的“伪造死亡”状态,并且用户体验不是很好。为了防止“假死”并改善用户体验,将进度条和文本框添加到此类型的方法中。进度条用于显示程序处理的进度,文本框用于显示和提示。该方法主要使用控件:backgroundWorker1;说明:此方法与以前的方法(方法二)的基本类型,主要是设计和代码都有一些更改。

第一步:主窗体设计:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控件名称:

button1; backgroundWorker1;

对于backgroundWorker1控件,属性设置:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

第2步:主要表单后台代码:

private void button1_Click(对象发送者,EventArgs e)

{

this.backgroundWorker1.RunWorkerAsync(); //运行backgroundWorker组件

ProcessForm表单=新的ProcessForm(this.backgroundWorker1); //显示进度条表单

form.ShowDialog(this);

form.Close();

}

private void backgroundWorker1_RunWorkerCompleted(对象发送者,RunWorkerCompletedEventArgs e)

{

如果(e.Error!= null)

{

MessageBox.Show(e.Error.Message);

}

否则(例如已取消)

{

}

其他

{

}

}

//您可以通过这种方式实现您的调用,方法等。

private void backgroundWorker1_DoWork(对象发送者c#进度条,DoWorkEventArgs e)

{

BackgroundWorker worker =发送者为BackgroundWorker;

for(int i = 0; i

{

Thread.Sleep(100);

worker.ReportProgress(i,i.ToString()+“ Hello!\ r \ n”); ///注意:这里将信息值返回到子窗体,这是两个值c#进度条,一个用于进度条,一个用于文本框。

if(worker.CancellationPending)//如果用户取消,则跳出处理数据代码

{

e.Cancel = true;

休息;

}

}

}

第3步:设置子表单(以及显示进度栏的表单):

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控制:

progressBar1; textBox1; button1

第4步:子窗体的背景代码:

private BackgroundWorker backgroundWorker1; // ProcessForm表单风暴(进度条表单)

public ProcessForm(BackgroundWorker backgroundWorker1)

{

InitializeComponent();

this.backgroundWorker1 = backgroundWorker1;

this.backgroundWorker1.ProgressChanged + =新的ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

this.backgroundWorker1.RunWorkerCompleted + =新的RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

}

void backgroundWorker1_RunWorkerCompleted(对象发送者,RunWorkerCompletedEventArgs e)

{

// this.Close(); //执行后,直接关闭页面

}

void backgroundWorker1_ProgressChanged(对象发送者,ProgressChangedEventArgs e)

{

this.progressBar1.Value = e.ProgressPercentage;

this.textBox1.AppendText(e.UserState.ToString()); // e.UserState.ToString()接受主窗体传递的值

}

private void button1_Click(对象发送者,EventArgs e)

{

this.backgroundWorker1.CancelAsync();

this.button1.Enabled = false;

this.Close();

}

达到的效果:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

注意:如果在执行程序后单击“取消”,则可能会报告错误。目前,您可以更改一种方法:backgroundWorker1_ProgressChanged

如下:

void backgroundWorker1_ProgressChanged(对象发送者,ProgressChangedEventArgs e)

{

this.progressBar1.Value = e.ProgressPercentage;

this.textBox1.Text + = e.UserState.ToString(); //e.UserState.ToString()接受主窗体传递的值

}

用上面的方法替换此方法,它将成功。

================================================ ================================================= ===

4、第四种方式:

功能描述:该方法实现进度条显示和方法执行信息反馈显示。使用的技术要点是线程和代理。

第1步:添加主页。

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控件名称:

button1;

第2步:主页的背景代码

使用System.Threading; //引用此名称

//创建代理。

私有Form6 myProcessBar = null; //弹出子表单(用于显示进度条)

私人委托bool GrowthHandle(int nValue,string vinfo); //代理的创建

private GrowthHandle myIncrease = null; //声明代理,用于先前的实例代理

private int vMax = 100; //用于实例化进度条c#进度条,您可以根据需要进行更改

private void button1_Click(对象发送者,EventArgs e)

{

线程thdSub = new Thread(new ThreadStart(ThreadFun));

thdSub.Start();

}

private void ThreadFun()

{

MethodInvoker mi =新的MethodInvoker(ShowProcessBar);

this.BeginInvoke(mi);

Thread.Sleep(100);

object objReturn = null;

for(int i = 0; i

{

objReturn = this.Invoke(this.myIncrease,new object [] {2,i.ToString()+“ \ r \ n”});

Thread.Sleep(50);

}

}

私有无效ShowProcessBar()

{

myProcessBar = new Form6(vMax);

myIncrease =新的GrowthHandle(myProcessBar.Increase);

myProcessBar.ShowDialog();

myProcessBar = null;

}

第3步:创建子表单

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

控件名称:

progressBar1; textBox1

第4步:子窗体,后面的代码

公共Form6(int vMax)

{

InitializeComponent();

this.progressBar1.Maximum = vMax;

}

公共布尔增加(int nValue,字符串nInfo)

{

if(nValue>0)

{

if(progressBar1.Value + nValue

{

progressBar1.Value + = nValue;

this.textBox1.AppendText(nInfo);

Application.DoEvents();

progressBar1.Update();

progressBar1.Refresh();

this.textBox1.Update();

this.textBox1.Refresh();

返回true;

}

其他

{

progressBar1.值= progressBar1.最大值;

this.textBox1.AppendText(nInfo);

// this.Close(); //执行后,自动关闭子窗体

返回假;

}

}

返回假;

}

执行效果:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

版权声明

本站搜集来源于网络,如侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。