【发布时间】:2016-01-30 00:51:32
【问题描述】:
当我的程序执行 PING 时,我在使用 ProgressBar 时遇到问题。错误提示“此 BackgroundWorker 当前很忙,无法同时运行多个任务”。谁能帮我 ?这些都是我做过的
private void ProsesSemuaKamera()
{
Stopwatch watch = Stopwatch.StartNew();
Ping ping = new Ping();
PingReply pingreply;
BackgroundWorker BWKamera = new BackgroundWorker();
OleDbConnection kon = new OleDbConnection(koneksi);
OleDbCommand command = kon.CreateCommand();
kon.Open();
string selecturl = "select * from datakamera";
command.CommandText = selecturl;
OleDbDataReader bacadata = command.ExecuteReader();
/* PING Kamera IP */
while (bacadata.Read())
{
pingreply = ping.Send(bacadata["ipadd"].ToString());
BWKamera.WorkerReportsProgress = true;
BWKamera.DoWork += BWKamera_DoWork;
BWKamera.ProgressChanged += BWKamera_ProgressChanged;
BWKamera.RunWorkerAsync(); //error exists here
if (pingreply.Status == IPStatus.Success)
{
listBox1.Items.Add(bacadata["namakamera"].ToString());
if (CaptureSemuaKamera == null)
{
try
{
CaptureSemuaKamera = new Capture(bacadata["urlkamera"].ToString());
}
catch (NullReferenceException ex)
{
MessageBox.Show(ex.Message);
}
}
if (CaptureSemuaKamera != null)
{
Application.Idle += new EventHandler(ProcessFrameSemuaKamera);
}
}
else if (pingreply.Status != IPStatus.Success)
{
listBox2.Items.Add(bacadata["namakamera"].ToString());
}
watch.Stop();
File.AppendAllText(@"D:\Dokumen\Alfon\TA Alfon\Waktu Eksekusi Ping.txt", "Waktu eksekusi ping " + DateTime.Now + " :" + " " + watch.Elapsed.TotalMilliseconds.ToString() + Environment.NewLine);
}
kon.Close();
}
private void BWKamera_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 1000; i++)
{
BWKamera.ReportProgress(i);
Thread.Sleep(1000);
}
}
private void BWKamera_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBarKamera.Value = e.ProgressPercentage;
StatusKamera.Text = "Please Wait...";
}
private void BWKamera_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
StatusKamera.Text = "Done !";
}
【问题讨论】:
-
您正尝试在您的
while (bacadata.Read())循环中启动您的BackgroundWorker,从而尝试为您从数据库中读取的每一行启动它。我不知道BWKamera_DoWork做了什么,所以我无法帮助您找到更好的方法。您应该考虑使用 Task.ContinueWith...BWKamera_DoWork将任务排队,因为您需要获取下一行并尝试重新启动它。 -
我刚刚添加了 BWKamera_DoWork。很抱歉忘记将其包含在我的代码中
-
这仍然不能解释后台工作人员与您从数据库中获取的行有什么关系。我仍然看不到您要实现的目标,但这看起来像是一个设计缺陷。为每一行启动一个后台工作者似乎并不是您真正想要的。也许
ProsesSemuaKamera实际上应该是后台工作人员的DoWork方法。
标签: c#