进度条假死的问题?急

yang_sy 2011-02-23 08:51:28
请大家帮我看看在提交数据的时候,数据比较大的时候会出现假死状态。我在网上查了一下,多说要使用多线程。我贴上程序麻烦高手帮忙给改改。可以不出现假死。谢谢


private void button1_Click(object sender, System.EventArgs e)
{
int i = 0;//进度条初始值
SqlConnection dbConn = new SqlConnection(sConnect);
dbConn.Open();
SqlCommand dbCmdMaxValues = new SqlCommand(MaxValues, dbConn);
string XuHao=dbCmdMaxValues.ExecuteScalar().ToString();
DataTable dt = Query(XuHao);//返回结果值
progressBar1.Maximum = dt.Rows.Count;//设置最大行数。
SqlCommand dbCmd = new SqlCommand();
foreach (DataRow row in dt.Rows)
{
string sql= @"INSERT INTO " + StationName + @"(序号,流水号)
VALUES("+Convert.ToInt32(row["序号"])+","Convert.ToString(row["流水号"])+")";
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.ExecuteNonQuery();
//进度条
progressBar1.Value=i++;
}
MessageBox.Show("成功!");
dbConn.Close();
}
...全文
192 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangweiwei130 2011-02-24
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Test

{
publicclass MyProgress
{
//by 闫磊 Email:Landgis@126.com,yanleigis@21cn.com 2007.10.30
privateint MaxNum;
Form progressForm=null;
ProgressBar progressBar1=null;
bool Stop=false;
Label label1;
publicbool ProgressStep(int step)
{
if (Stop)
{
this.Dispose();
returntrue;
}
if (progressBar1.Value > progressBar1.Maximum)
{
this.Dispose();
returntrue;
}

progressBar1.Value+= step;
label1.Text = "目前完成:" + (progressBar1.Value * 100 / progressBar1.Maximum) + "%";
Application.DoEvents();

returnfalse;
}
privatevoid btn_Click(object sender, EventArgs e)
{
if (MessageBox.Show("你确定终止吗", "终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)
Stop = false;
else
Stop = true;
}
public MyProgress(int Max, String Caption, bool IsCancel)//最大值和标题
{
progressForm = newForm();
progressForm.MinimizeBox = false;
progressForm.MaximizeBox = false;
progressForm.StartPosition = FormStartPosition.CenterScreen;
progressForm.Width = 326+19;
progressForm.Height = 96+19+20;
progressForm.Text= Caption;
progressForm.TopMost = true;//设置窗口在上边
label1 = new Label();
label1.Left = 9;
label1.Top = 15;
label1.Parent = progressForm;
progressBar1 = new ProgressBar();
progressBar1.Maximum = Max;
MaxNum = Max;
progressBar1.Left = 9;
progressBar1.Top = 25+15;
progressBar1.Width = 310;
progressBar1.Parent = progressForm;
progressBar1.Value = 0;

if (IsCancel)
{
Button btnCancel = new Button();
btnCancel.Text = "取消";
btnCancel.Left = 240;
btnCancel.Top = 54+20;
btnCancel.Parent = progressForm;
btnCancel.Click += new System.EventHandler(this.btn_Click);

}
progressForm.Show();

}
publicvoid Dispose()
{
if (progressForm != null)
{
progressBar1.Dispose();
progressForm.Dispose();
}
}
}
}
----------------------------------
//调用测试 进度条窗口
privatevoid button2_Click(object sender, EventArgs e)
{
MyProgress myProgress = new MyProgress(100, "进度条", true);
try
{
for (int i = 0; i < 100; i++)
{
if (myProgress.ProgressStep(1)) return;
Application.DoEvents();//让系统在百忙中抽空刷新

Thread.Sleep(100);
}
}
finally
{
myProgress.Dispose();
}
}

//--------------------------------按高手的意思修改BackgroundWorker,如下
//使用BackgroundWorker异步进度条
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;//BackgroundWorker所在的
using System.Windows.Forms;
namespace Test
{
class MyNewProgress
{
private BackgroundWorker backgroundWorker = null;
//by 闫磊Email:Landgis@126.com,yanleigis@21cn.com 2007.10.31
privateint MaxNum;
Form progressForm = null;
ProgressBar progressBar1 = null;

Label label1;

privatevoid btn_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy)
{
if (MessageBox.Show("你确定终止吗", "终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
backgroundWorker.CancelAsync();
}
}
publicvoid OnProcessCompleted(object sender, EventArgs e)
{
Dispose();
}

publicvoid OnProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Text = "目前完成:" + (progressBar1.Value * 100 / progressBar1.Maximum) + "%";
}
privatevoid worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//return;

/*if (e.Cancelled)
{
MessageBox.Show("取消");
}
else if (e.Error != null)
{
MessageBox.Show("错误");
}
else
{

MessageBox.Show("完成");
}
*/
}
privatevoidForm_FormClosing(object sender, FormClosingEventArgs e) //处理窗口直接关闭事件
{
if (backgroundWorker.IsBusy)
{
if (MessageBox.Show("你确定终止吗", "终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
backgroundWorker.CancelAsync();
else
e.Cancel = true;
}
}

//把事件传进入
privatevoid SetbackgroundWorker(DoWorkEventHandler DoWork, ProgressChangedEventHandler worker_ProgressChanged)
{
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;//有进度条
backgroundWorker.WorkerSupportsCancellation = true;//是否支持异步取消
backgroundWorker.DoWork += new DoWorkEventHandler(DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);//做的事情
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(OnProgressChanged);//更新进度条
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//完成事件
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(OnProcessCompleted);
backgroundWorker.RunWorkerAsync();
}
public MyNewProgress(int Max, String Caption, bool IsCancel, DoWorkEventHandler DoWork, ProgressChangedEventHandler worker_ProgressChanged)//最大值和标题
{
progressForm = newForm();
progressForm.MinimizeBox = false;
progressForm.MaximizeBox = false;
progressForm.StartPosition = FormStartPosition.CenterScreen;
progressForm.Width = 326 + 19;
progressForm.Height = 96 + 19 + 20;
progressForm.Text = Caption;
progressForm.TopMost = true;//设置窗口在上边
label1 = new Label();
label1.Left = 9;
label1.Top = 15;
label1.Parent = progressForm;
progressBar1 = new ProgressBar();
progressBar1.Maximum = Max;
MaxNum = Max;
progressBar1.Left = 9;
progressBar1.Top = 25 + 15;
progressBar1.Width = 310;
progressBar1.Parent = progressForm;
progressBar1.Value = 0;

if (IsCancel)
{
Button btnCancel = new Button();
btnCancel.Text = "取消";
btnCancel.Left = 240;
btnCancel.Top = 54 + 20;
btnCancel.Parent = progressForm;
btnCancel.Click += new System.EventHandler(this.btn_Click);

}
progressForm.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_FormClosing);
progressForm.Show();
SetbackgroundWorker(DoWork, worker_ProgressChanged);

}
publicvoid Dispose()
{
if (progressForm != null)
{
progressBar1.Dispose();
progressForm.Dispose();
}
}
}
}
//测试方法,放一个按钮button和标签label1
privatevoid worker_DoWork(object sender, DoWorkEventArgs e)
{
DoNothing((BackgroundWorker)sender, e);
}

privatevoid DoNothing(BackgroundWorker worker, DoWorkEventArgs e)
{
//要做的事情,写在这里
int num = 100;
for (int i = 0; i <num; i++)
{
// Check for cancellation
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
worker.ReportProgress((i + 1) * (100 / num));

Thread.Sleep(100);
}
}

}

privatevoid worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = e.ProgressPercentage.ToString();

}
privatevoid button1_Click(object sender, EventArgs e)
{
MyNewProgress myProgress = new MyNewProgress(100, "进度条", true, worker_DoWork, worker_ProgressChanged);

}
yang_sy 2011-02-24
  • 打赏
  • 举报
回复
谢谢!测试成功
yang_sy 2011-02-24
  • 打赏
  • 举报
回复
还要问大家一个问题。下面代码已经测试成功了,但是有一个问题,就是数据库在insert 的时候总提示超时。
我是网外网插入数据的。内网测试一切正常。但是外网的时候能插入大概70多行就提示超时了。
外网的ping 值在65左右,比较平稳。

错误:
时时间已到。在操作完成之前超时时间已过或服务器未响应。
或有时出现
在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用。)
请问有什么好的办法吗?
注:外网为铁通光纤。传输是跨省的。


private void button1_Click(object sender, System.EventArgs e)
{
Thread thread = new Thread(InsertData);
thread.Start();
}

private void InsertData()
{
int i = 0;//进度条初始值
using( SqlConnection dbConn = new SqlConnection(sConnect) )
{
dbConn.Open();
SqlCommand dbCmdMaxValues = new SqlCommand(MaxValues, dbConn);
string XuHao = dbCmdMaxValues.ExecuteScalar().ToString();
DataTable dt = Query(XuHao);//返回结果值
//progressBar1.Maximum = dt.Rows.Count;//设置最大行数。
Action<int> setProgress1 = x => progressBar1.Maximum = x;
progressBar1.Invoke(setProgress1, dt.Rows.Count);
SqlCommand dbCmd = new SqlCommand();
Action<int> setProgress2 = x => progressBar1.Value = x;
foreach (DataRow row in dt.Rows)
{
string sql= @"INSERT INTO " + StationName + @"(序号,流水号)
VALUES("+Convert.ToInt32(row["序号"])+","Convert.ToString(row["流水号"])+")";
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.ExecuteNonQuery();
//进度条
progressBar1.Invoke(setProgress2, i++);
}
MessageBox.Show("成功!");
dbConn.Close();
}
}


机器人 2011-02-23
  • 打赏
  • 举报
回复

private void button1_Click(object sender, System.EventArgs e)
{
Thread thread = new Thread(InsertData);
thread.Start();
}

private void InsertData()
{
int i = 0;//进度条初始值
using( SqlConnection dbConn = new SqlConnection(sConnect) )
{
dbConn.Open();
SqlCommand dbCmdMaxValues = new SqlCommand(MaxValues, dbConn);
string XuHao = dbCmdMaxValues.ExecuteScalar().ToString();
DataTable dt = Query(XuHao);//返回结果值
//progressBar1.Maximum = dt.Rows.Count;//设置最大行数。
Action<int> setProgress1 = x => progressBar1.Maximum = x;
progressBar1.Invoke(setProgress1, dt.Rows.Count);
SqlCommand dbCmd = new SqlCommand();
Action<int> setProgress2 = x => progressBar1.Value = x;
foreach (DataRow row in dt.Rows)
{
string sql= @"INSERT INTO " + StationName + @"(序号,流水号)
VALUES("+Convert.ToInt32(row["序号"])+","Convert.ToString(row["流水号"])+")";
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.ExecuteNonQuery();
//进度条
progressBar1.Invoke(setProgress2, i++);
}
MessageBox.Show("成功!");
dbConn.Close();
}
}

yang_sy 2011-02-23
  • 打赏
  • 举报
回复
非常感谢
全栈极简 2011-02-23
  • 打赏
  • 举报
回复
1、用 backgroundworker控件,具体属性和方法请search一下,网上有很多例子
2、用Thread类开一个线程,具体操作请search一下,单线程就可以不假死。
progressBar1.Value++;//这样就可以,没必要再定义i++中间变量,节省点空间吧。
yang_sy 2011-02-23
  • 打赏
  • 举报
回复
麻烦能不能帮改一下?
SpecialName8 2011-02-23
  • 打赏
  • 举报
回复
//进度条
progressBar1.Value=i++;
Application.DoEvents()


或者用backGroundWorker 在ProgressChanged时间中改变进度条
yang_sy 2011-02-23
  • 打赏
  • 举报
回复
我是想根据准确的插入数据来显示进度条执行状态,就是插入一条数据,进度条加一。insert那部分写的有点问题,但是不耽误整体阅读,请高手见谅。

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧