c#联系关系进度条
c#关联进度条
我写好了一个Winform窗体小程序,因为在程序处理数据计算的时候需要一段时间,为了显示程序还在运行状态,不让用户以为程序没反应,所以希望用一个进度条显示程序运行的进度,当点击运行按钮的时候,就可以关联起来显示进度,我在网上找到了如下代码,代码本身没有错误,但我要怎么把我的代码和如下代码关联呢?应该在哪里调用呢?[code=csharp private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
}
else
{
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 100; i++)
{
Thread.Sleep(1000);
worker.ReportProgress(i, i.ToString()); //注意:这里向子窗体返回信息值,这里是两个值,一个用于进度条,一个用于文本框的。
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
break;
}
}
}
private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)
public ProcessForm(BackgroundWorker backgroundWorker1)
{
InitializeComponent();
this.backgroundWorker1 = backgroundWorker1;
this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Close();//执行完之后,直接关闭页面
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.textBox1.AppendText(e.UserState.ToString());//主窗体传过来的值,通过e.UserState.ToString()来接受
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.button1.Enabled = false;
this.Close();
}
}
][/code]
------解决思路----------------------
你的进度内容写在这个backgroundWorker1_DoWork方法里, 循环100次的更新进度条换成你的程序处理数据更新进度条就行了
------解决思路----------------------
我的代码
-》 一般放在DoWork方法中,谁知道你的代码是什么功能。
------解决思路----------------------
不用往下看,但看这里的思路,就知道你的问题出在哪里,这种问题会产生多么诡异的结果。
当你显示一个“进度条窗体”,它就是来显示的,你在这里又显示、又阻塞、又关闭,这是干什么呢?只有同步顺序的思路,没有学会异步的思路,那么就完蛋了,写不出一个合适的并发多线程程序。
要显示一个窗体就显示,然后这个工作就完毕了。至于说进度条走到了100%之后,进度窗体捕获了这个事件发生的通知而关闭了自己,那是另外一个工作。这两个东西如果阻塞、同步地去设计在一起,那么你的脑袋还能容得下多少事情?
一些自认为挺能追求时髦的“并发、线程”概念的人,如果头脑中还是只有写一个简单的数学计算函数式的同步编程习惯,那么很快就会疯掉的。因为他们的脑容量实在是塞不下着太多的“死循环、阻塞、等待”的大量干扰。
这种设计思路从根本上,就是文盲。需要正规地学习异步、高并发的程序设计思路。注意是“设计”,而跟特定编程语言的无关。
------解决思路----------------------
想搞明白如何比较科学地设计并发程序,那么就从把代码
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close();
改为
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.Show();
开始吧。
应该先在纸上把流程图画出来,你画出来的流程图应该能反映出异步流程程序跟同步程序的区别。跟编程语言具体代码无关,你应该先学绘画流程图。
------解决思路----------------------
http://blog.****.net/jiankunking/article/details/45642597
可以试试这个
我写好了一个Winform窗体小程序,因为在程序处理数据计算的时候需要一段时间,为了显示程序还在运行状态,不让用户以为程序没反应,所以希望用一个进度条显示程序运行的进度,当点击运行按钮的时候,就可以关联起来显示进度,我在网上找到了如下代码,代码本身没有错误,但我要怎么把我的代码和如下代码关联呢?应该在哪里调用呢?[code=csharp private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
}
else
{
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 0; i < 100; i++)
{
Thread.Sleep(1000);
worker.ReportProgress(i, i.ToString()); //注意:这里向子窗体返回信息值,这里是两个值,一个用于进度条,一个用于文本框的。
if (worker.CancellationPending) // 如果用户取消则跳出处理数据代码
{
e.Cancel = true;
break;
}
}
}
private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)
public ProcessForm(BackgroundWorker backgroundWorker1)
{
InitializeComponent();
this.backgroundWorker1 = backgroundWorker1;
this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Close();//执行完之后,直接关闭页面
}
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
this.textBox1.AppendText(e.UserState.ToString());//主窗体传过来的值,通过e.UserState.ToString()来接受
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
this.button1.Enabled = false;
this.Close();
}
}
][/code]
------解决思路----------------------
你的进度内容写在这个backgroundWorker1_DoWork方法里, 循环100次的更新进度条换成你的程序处理数据更新进度条就行了
------解决思路----------------------
我的代码
-》 一般放在DoWork方法中,谁知道你的代码是什么功能。
------解决思路----------------------
不用往下看,但看这里的思路,就知道你的问题出在哪里,这种问题会产生多么诡异的结果。
当你显示一个“进度条窗体”,它就是来显示的,你在这里又显示、又阻塞、又关闭,这是干什么呢?只有同步顺序的思路,没有学会异步的思路,那么就完蛋了,写不出一个合适的并发多线程程序。
要显示一个窗体就显示,然后这个工作就完毕了。至于说进度条走到了100%之后,进度窗体捕获了这个事件发生的通知而关闭了自己,那是另外一个工作。这两个东西如果阻塞、同步地去设计在一起,那么你的脑袋还能容得下多少事情?
一些自认为挺能追求时髦的“并发、线程”概念的人,如果头脑中还是只有写一个简单的数学计算函数式的同步编程习惯,那么很快就会疯掉的。因为他们的脑容量实在是塞不下着太多的“死循环、阻塞、等待”的大量干扰。
这种设计思路从根本上,就是文盲。需要正规地学习异步、高并发的程序设计思路。注意是“设计”,而跟特定编程语言的无关。
------解决思路----------------------
想搞明白如何比较科学地设计并发程序,那么就从把代码
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.ShowDialog(this);
form.Close();
改为
ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
form.Show();
开始吧。
应该先在纸上把流程图画出来,你画出来的流程图应该能反映出异步流程程序跟同步程序的区别。跟编程语言具体代码无关,你应该先学绘画流程图。
------解决思路----------------------
http://blog.****.net/jiankunking/article/details/45642597
可以试试这个