Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中长时间运行任务的进度条#_C#_Sql_Multithreading_Progress Bar - Fatal编程技术网

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

C# C中长时间运行任务的进度条#,c#,sql,multithreading,progress-bar,C#,Sql,Multithreading,Progress Bar,我的应用程序运行一些可能需要很长时间的数据库查询 在执行这些查询时,我的应用程序似乎冻结了,看起来应用程序已经停止工作 我需要使用progressbar来避免这个问题,但我不确定如何预测执行查询所需的时间 下面是运行查询的代码 private void CheckSsMissingDate() { while (DateTime.Parse(time) <= DateTime.Now) { var ssCon = OpenSQLConnection(); v

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

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

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

下面是运行查询的代码

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.";
    }
}
private void CheckSsMissingDate()
{

while(DateTime.Parse(time)如果不希望应用程序冻结,则应使用最近在C#中实现的async/await关键字,或者可以手动编写异步代码


参考资料:

您可以使用
BackgroundWorker()
来解决此类问题

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

然后在开始执行查询时使用以下代码,如
按钮1\u 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");
  }

首先要解决的问题是:使用参数化SQL,而不是将日期作为字符串包含在内……查询可能正在锁定应用程序,因为它正在UI线程上运行。此代码是否直接从按钮调用?请先查看运行方法Async以避免锁定线程,然后考虑显示进度条。包装
IDisposable
s进入
使用
s。问题,后台工作人员如何知道进度百分比?如何计算“工作”将花费多长时间?@harag by
void bgw_progresschange(对象发送者,ProgressChangedEventArgs e){//progressbar.progressBar1.Value=e.ProgressPercentage;}
但是SQL是什么样子的?我确信它必须返回正确的ProgressPercentage值,否则您的进度条将永远不会准确。
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");
  }