Индикатор выполнения длительной задачи в C#
Мое приложение выполняет некоторые запросы к базе данных, которые могут занять много времени.
Во время выполнения этих запросов мое приложение, кажется, замерзает, и похоже, что приложение перестало работать.
Мне нужно использовать 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.";
}
}
Как я могу показать индикатор выполнения, чтобы показать ход выполнения запроса?
2 ответа:
Вы можете использовать
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"); }
Если вы не хотите, чтобы ваше приложение зависало, вы должны использовать ключевые слова async / await, недавно реализованные в C#, или вы можете написать свой асинхронный код вручную.
Ссылка: MSDN