c# - C#中长时间运行任务的进度条

标签 c# sql multithreading progress-bar

我的应用程序运行一些可能需要很长时间的数据库查询。

在执行这些查询时,我的应用程序似乎卡住了,看起来应用程序已停止工作。

我需要使用进度条来避免这个问题,但我不确定如何预测执行查询所需的时间。

运行查询的代码如下

private void CheckSsMissingDate()
 {
  while (DateTime.Parse(time) <= DateTime.Now)
   {
     var ssCon = OpenSQLConnection();
     var cmd = new SqlCommand("SELECT TOP (1)Date_Time,Value1,Value2,Value3,Value4,Value5,Value6,
         "+ "Value7,Value8,Value9 from RAW_S001T01 where Date_Time >='" + tempTime + "'",ssCon);
     var dr = cmd.ExecuteReader();
     var count = 0;
     while (dr.Read())
      {
        ssChkDate = (dr["Date_Time"].ToString());
        conssChkDate = DateTime.Parse(ssChkDate).ToString("yyyy-MM-dd HH:mm:ss");
        tempTime = Convert.ToDateTime(ssChkDate);
        tempTime = tempTime.AddMinutes(15);
        TValue1 = (dr["Value1"].ToString());
        TValue2 = (dr["Value2"].ToString());
        TValue3 = (dr["Value3"].ToString());
        TValue4 = (dr["Value4"].ToString());
        TValue5 = (dr["Value5"].ToString());
        TValue6 = (dr["Value6"].ToString());
        TValue7 = (dr["Value7"].ToString());
        TValue8 = (dr["Value8"].ToString());
        TValue9 = (dr["Value9"].ToString());
        if (CheckMsMissingDate(conssChkDate) == false)
          {
            InsertMissing(conssChkDate,TValue1,TValue2,TValue3,TValue4,TValue5,TValue6,TValue7,TValue8,TValue9);
                    count = count + 1;
           }
        }
       dr.Close();
       ssCon.Close();
       updateCount.Text = count + @" Missing Records added.";
    }
}

如何显示进度条来显示查询的进度?

最佳答案

你可以使用BackgroundWorker()来解决这类问题。

首先定义一个BackgroundWorker()类的全局变量 喜欢

private BackgroundWorker bgw;

然后使用下面的代码开始您的查询执行,例如 button1_Click() 事件或任何其他内容。

bgw = new BackgroundWorker();
bgw.WorkerReportsProgress = true;
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerAsync();

现在定义方法如下:

void bgw_DoWork(object sender, DoWorkEventArgs e)
 {
  //Your time taking work. Here it's your data query method.
  CheckSsMissingDate();
 }

void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
   //Progress bar.
   progressBar1.Value = e.ProgressPercentage;
 }

 void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
   //After completing the job.
   MessageBox.Show(@"Finished");
  }

关于c# - C#中长时间运行任务的进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20759386/

相关文章:

php - Symfony2/Doctrine2 : Don't drop fulltext index on schema:update

mysql - 按任意行数对 SQL 查询进行分区

php - 使用 WHERE 子句检查记录是否接收不同的值

javascript - Parallel.js 如何在 Javascript 中进行多线程编程?

c - 这两个中断服务程序中的竞争条件是什么?

c# - VS2013 构建不包括项目依赖项的 Nuget 依赖项的二进制文件

c# - 数字和斜杠的正则表达式

c# - 在 WinForms 应用程序中拆分 wmv/wav 文件

c# - object.object 的最佳重载匹配有一些无效参数

c++ - 使用 C++11 异步时 Libusb 挂起