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 スレッドで実行されます。

InvokeUI コントロールを変更する場所ごとに別の を作成し、重い作業はInvokes の外に残します。

于 2012-05-17T16:09:25.483 に答える
0

最初のデリゲートで実際の作業を行います。2 番目のデリゲートthis.Invoke(...)は、フォームのスレッド (= メイン スレッド) で実行されるため、UI をブロックします。

于 2012-05-17T16:09:05.117 に答える