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();
}
展开
 我来答
哲事姓无
2013-09-03 · TA获得超过1176个赞
知道小有建树答主
回答量:903
采纳率:100%
帮助的人:442万
展开全部

你应该是将导入的过程放在界面线程中进行了,这样当进行导入操作时界面将会被阻塞直到操作完成。

所以导入操作要放在线程中进行操作,这样就不会阻塞界面了。大致方法如下:


    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函数了。
syht2000
高粉答主

2013-09-03 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.4亿
展开全部
在for里加上一行,比如加在进度条变化之后
this.progressBar1.Value++;
Application.DoEvents();
try
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3831f2b
2013-09-04 · TA获得超过162个赞
知道小有建树答主
回答量:143
采纳率:100%
帮助的人:94.1万
展开全部
this.progressBar1.invoke(new Action(()=>{ this.progressBar1.Value++;}))
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zxqzlh
2013-09-03 · 超过14用户采纳过TA的回答
知道答主
回答量:52
采纳率:0%
帮助的人:30.9万
展开全部
少量数据的话可能加载速度太快了,。解决方法:设段延时程序再自增
大数据的话可能会卡死主线程,之后装载完后主线程恢复正常,所以一下就满了。开多线程。或者异步加载
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式