【问题标题】:This BackgroundWorker is currently busy and cannot run multiple tasks concurrently when PING Ip addresses这个BackgroundWorker当前很忙,PING IP地址时不能同时运行多个任务
【发布时间】: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#


【解决方案1】:

因为它在一个while循环中。我将假设第一个后台工作人员尚未完成,您正在告诉它在同一实例上再次运行。

OleDbDataReader bacadata = command.ExecuteReader();
BWKamera.WorkerReportsProgress = true;
BWKamera.DoWork += BWKamera_DoWork;
BWKamera.ProgressChanged += BWKamera_ProgressChanged;

BWKamera.RunWorkerAsync(bacadata);

那么后台工作代码将如下所示:

        private void BWKamera_DoWork(object sender, DoWorkEventArgs e)
    {

    OleDbDataReader bacadata = (OleDbDataReader)e.Argument;
    while (bacadata.Read())
        {
            pingreply = ping.Send(bacadata["ipadd"].ToString());

【讨论】:

  • 哦,我明白了。但是我想对我的数据库中的所有 IP 进行 PING,并且当我的程序对我的数据库中的 IP 执行 Ping 时,进度条将一直工作,直到 Ping 过程完成。你能帮我吗?
  • 您可以将 while 循环放在后台工作程序中。在异步调用上设置 bacadata。查看修改后的答案
  • 您可能只想将整个 db 调用放在后台工作程序上,而不是在主线程中连接,然后在工作线程中读取行。
  • 我尝试使用该代码,但出现错误提示“跨线程操作无效:控件'listBox2'从创建它的线程以外的线程访问”跨度>
  • 是的,您无法访问后台工作线程之外的变量或对象,即您无法直接更新表单控件。您可以收集数据并在后台工作人员完成后将其作为结果返回。然后从主线程访问结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多