c#中进度条的使用问题
我在C#中使用了一个进度条,目的是为了在给数据库中导入数据的时候显示导入进度,后来我发现导入数据时,进度条没有反应,只有当数据全部导入之后才一次性充满整个进度条,我想让他...
我在C#中使用了一个进度条,目的是为了在给数据库中导入数据的时候显示导入进度,后来我发现导入数据时,进度条没有反应,只有当数据全部导入之后才一次性充满整个进度条,我想让他实时显示导入进度,求解决方法。若是涉及到多线程的问题,还请高手详细举例讲解。
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
this.progressBar1.Value = 0;
this.progressBar1.Maximum = lines.Count();
for (int i = 1; i < lines.Count();i++ )
{
string line = lines[i];
string[] strs = line.Split('\t');
string StartTel = strs[0];
string city = strs[1];
city = city.Trim('"');
string teltype = strs[2];
teltype = teltype.Trim('"');
string sql = @"insert into T_TelNum(StartTelNum,TelType,TelArea)
values('" +StartTel+ "','" +city+ "','" +teltype+ "')";
this.progressBar1.Value++;
try
{
conX.Open();
SqlCommand cmd = new SqlCommand(sql,conX);
cmd.ExecuteNonQuery();
}
catch(SqlException ex)
{
MessageBox.Show(ex.Message,"错误提示信息.....");
}
conX.Close();
} 展开
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
this.progressBar1.Value = 0;
this.progressBar1.Maximum = lines.Count();
for (int i = 1; i < lines.Count();i++ )
{
string line = lines[i];
string[] strs = line.Split('\t');
string StartTel = strs[0];
string city = strs[1];
city = city.Trim('"');
string teltype = strs[2];
teltype = teltype.Trim('"');
string sql = @"insert into T_TelNum(StartTelNum,TelType,TelArea)
values('" +StartTel+ "','" +city+ "','" +teltype+ "')";
this.progressBar1.Value++;
try
{
conX.Open();
SqlCommand cmd = new SqlCommand(sql,conX);
cmd.ExecuteNonQuery();
}
catch(SqlException ex)
{
MessageBox.Show(ex.Message,"错误提示信息.....");
}
conX.Close();
} 展开
4个回答
展开全部
你应该是将导入的过程放在界面线程中进行了,这样当进行导入操作时界面将会被阻塞直到操作完成。
所以导入操作要放在线程中进行操作,这样就不会阻塞界面了。大致方法如下:
private void ButtonOnClick(object sender, EventArgs eventArgs)
{
// 这里假设点击了按钮开始启动
string[] lines = File.ReadLines(ofd.FileName, Encoding.Default).ToArray();
progressBar1.Value = 0;
progressBar1.Maximum = lines.Count();
// 推荐使用 BackgroundWorker ,这里为方便使用了Thread
var thread = new Thread(ImportData) {IsBackground = true};
thread.Start(lines);
}
private void ImportData(object obj)
{
string[] lines = (string[]) obj;
for (int i = 1; i < lines.Count(); i++)
{
// 因为在线程中调用界面控件,所以这里要委托界面控件进行调用
MethodInvoker invoker = () => { progressBar1.Value++; };
progressBar1.Invoke(invoker);
// 下面与原来的方法是一样的
}
}
追问
是整个导入的过程包括进度条的使用都要放到线程中吗?
追答
基本的指导是整个导入的过程都放在线程中,这样导入就不会干扰界面了。当然也可以将部分最耗时的调用放在线程中。而进度条的进度是在导入的过程中设置的,所以进度条控件是被导入过程所在的线程中被调用。但是如果在线程中直接设置界面控件的时候会导致一个错误(.net 2之前默认不是错误,但是.net 2 之后默认不允许这么做)。这样就需要在线程在设置界面时先切换到界面所在线程然后调用界面控件,这个就是Invoke函数了。
展开全部
在for里加上一行,比如加在进度条变化之后
this.progressBar1.Value++;
Application.DoEvents();
try
{
this.progressBar1.Value++;
Application.DoEvents();
try
{
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
this.progressBar1.invoke(new Action(()=>{ this.progressBar1.Value++;}))
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
少量数据的话可能加载速度太快了,。解决方法:设段延时程序再自增
大数据的话可能会卡死主线程,之后装载完后主线程恢复正常,所以一下就满了。开多线程。或者异步加载
大数据的话可能会卡死主线程,之后装载完后主线程恢复正常,所以一下就满了。开多线程。或者异步加载
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询