1

在我的应用程序中,我想在后台创建数千个文件,但是当我执行此操作时,它总是冻结我的表单(创建所有文件后,我可以再次使用我的表单)。如何在不挂起的情况下正常运行?

private void button5_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        bw.WorkerReportsProgress = true;

        bw.DoWork += new DoWorkEventHandler(
        delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            this.Invoke(new MethodInvoker(delegate
            {
                getValues();//load some text fields into strings

                while (counter < counted)
                {
                    text = richTextBox1.Text;
                    text = text.Replace("number", finalNumber);

                    //create copies
                    if (checkBox1.Checked == true)
                    {
                        while (createdCopies < copies)
                        {
                            createdCopies++;

                            File.WriteAllText(fileName, text);
                            overalCounter++;
                            b.ReportProgress(overalCounter);
                        }
                        counter++;
                        createdCopies = 0;
                    }
                    //dont create copies
                    else
                    {
                        File.WriteAllText(fileName, text);
                        counter++;
                        overalCounter++;
                        b.ReportProgress(overalCounter);
                    }
                    //info about number of files created
                    label6.Text = "created " + overalCounter.ToString() + " files";

                }
                label1.Text = "success";
            }));
    });

    if (bw.IsBusy != true)
    {
        bw.RunWorkerAsync();
    }

    bw.ProgressChanged += new ProgressChangedEventHandler(
    delegate(object o, ProgressChangedEventArgs args)
    {
        this.Text = string.Format("{0}% Completed", args.ProgressPercentage);
    });
    }
4

2 回答 2

3

this.Invoke在 UI 线程上运行代码,阻止任何 UI 更新。
由于您在Invoke方法中运行所有内容,因此所有内容都将在 UI 线程上运行。

Invoke在您修改 UI 控件的每个位置周围创建一个单独的位置,并将繁重的工作留在Invokes.

于 2012-05-17T16:09:25.483 回答
0

在你的第一个代表中做实际的工作。第二个委托this.Invoke(...)在表单的线程(=主线程)上执行,因此会阻止您的 UI。

于 2012-05-17T16:09:05.117 回答