c# - Background Worker 被调用两次

标签 c# .net winforms backgroundworker

我的后台工作程序有问题,因此它被调用了两次,增加了我的长例程的执行时间,我手动创建了后台工作程序,所以没有机会在 initializeComponent() 方法中初始化 DoWork , 任何帮助表示赞赏。

这是我的代码:

// constructor


           public TeacherScheduleForm(Therapist therapist)
            {
                this.therapist = therapist;

                InitializeComponent();

                bw = new BackgroundWorker();
                bw.WorkerSupportsCancellation = true;
                bw.WorkerReportsProgress = true;
                bw.DoWork += bw_DoWork;
                bw.ProgressChanged += bw_ProgressChanged;
                bw.RunWorkerCompleted += bw_RunWorkerCompleted;
                load = new LoadingForm();
    }
 private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            load.AppendProgress(e.ProgressPercentage);
           // load.AppendText(e.ProgressPercentage.ToString() + "%");
            Console.Write("Progress: " + e.ProgressPercentage);
           // MessageBox.Show("Progress : " + e.ProgressPercentage);

        }

        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                MessageBox.Show("Cancelled");

            }

            else if (!(e.Error == null))
            {
                MessageBox.Show("Error : " + e.Error);

            }

            else
            {
                updateUI();
                load.Close();
                Console.Write( "Done!");
            }
        }


        // do work of background worker
        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; (i <= 2); i++)
            {
                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    Console.Write("Before Doing work");

                    setup(therapist.therapistID + "", schoolYear);// the time consuming operation
                    Console.Write("Doing work");
                    //System.Threading.Thread.Sleep(100);
                    worker.ReportProgress((i*5));
                }
            }
        }

当用户通过以下代码中的组合框选择学年时调用后台工作程序:

 private void comboBoxSchoolYear_SelectedIndexChanged(object sender, EventArgs e)
    {
        //load = new LoadingForm();
        schoolYear = int.Parse(comboBoxSchoolYear.SelectedValue + "");
        try{
            if (!bw.IsBusy)
            {
                bw.RunWorkerAsync();
                load.ShowDialog();
            }
            else
            {
                bw.CancelAsync();
            }
        }
        catch(Exception ex)
        {
            Console.Write("Error : " + ex.Message);
        }
    }

最佳答案

您在创建事件处理程序后加载表单。那是我唯一能想到的麻烦。尝试先加载表单,然后创建处理程序。

原因:InitializeComponent(); IndexChanged 通常会启动,因为控件在此时设置了它的索引。直到现在我还没有注意到 FormLoad 上的这种行为。但我在这里看不到任何其他问题,值得一试。

如果这不能解决问题,您还应该注意 TeacherScheduleForm 是否被调用了两次。


方便调试的东西:

MessageBox.Show((new StackTrace().GetFrame(0).GetMethod().Name));

将其粘贴到您的事件/方法或其他内容中。它将弹出一个消息框,其中包含调用您当前方法的方法名称。在这种情况下(来自评论)它会引发 2 个 messageBoxes 说 TeacherScheduleForm 两者。

我已将其保存到我的代码片段中。

关于c# - Background Worker 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31919290/

相关文章:

c# - 验证文本框只允许小数

c# - WCF 错误架构

c# - 将属性从对象复制到另一个的优雅方式

c# - 网络 API 错误 : "No HTTP resource was found that matches the request URI"

.net - 检查字符串列表是否包含值

c# - 如何在编辑 DataGridView 单元格周围绘制边框?

c# - 当类的名称是根元素时,Newtonsoft json 不会反序列化

.net - 如何在.NET 中等待另一个进程的状态?

c# - 多个异步方法,最好使用具有不同返回类型的 WhenAll

c# - 单击了哪个控件?