3

この問題を解決するにはどうすればよいですか?

プロセスが完了するまで、プロセス中にプログレスバーがロードされることを期待しています

これが私のコードです:

private void btnProcess_Click(object sender, EventArgs e)
    {
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
        backgroundWorker.DoWork += backgroundWorker_DoWork;

        backgroundWorker.RunWorkerAsync();
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //start transaction
        DoTransaction();
    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

私のトランザクション機能:

private void DoTransaction()
    {
        string pathIdentifier;
        pathIdentifier = func.checkthePathFile();
        if (pathIdentifier == null)
        {
            MessageBox.Show("Path has no yet been specified!");
        }
        else
        {
            //create xml base from user inputs
            XElement transactXML = new XElement("Transaction",
                new XElement("CardNumber", txtCardNum.Text.Trim()),
                new XElement("ExpireDate", txtExpDate.Text.Trim()),
                new XElement("Cardtype", txtCardType.Text.Trim())
                );

            //save xml to a file
            transactXML.Save(pathIdentifier + "/sample.xml");
        }
    }
4

2 に答える 2

3

ランタイムは、プロセスがどれだけ進んでいるかをどのように知ることになっていますか?

backgroundWorker.ReportProgressバックグラウンド操作から呼び出して伝える必要があります。ここには魔法はありません。

MSDN: http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

プロセスを意味のあるチャンクに分解し、ReportProgressそうすることが理にかなっているときはいつでも。

public void DoTransaction()
{
    part1();
    backgroundWorker.ReportProgress(25);

    part2();
    backgroundWorker.ReportProgress(50);

    part3();
    backgroundWorker.ReportProgress(75);

    part4();
    backgroundWorker.ReportProgress(100);
}

Transaction() 関数の転記に基づく編集

マルチスレッド プログラムの作成に自信がない場合は、マルチスレッド プログラムを作成しようとしないでください。それらの詳細の一部を抽象化しようとする BackgroundWorker の助けを借りても、マルチスレッド プログラムを作成しないでください。

いくつかの問題:

提供されたメソッドは、バックグラウンド スレッドからさまざまなコントロールのプロパティTransaction()を起動しMessageBoxて読み取ろうとします。TextUI 要素がそれらを作成したスレッド以外のスレッドからアクセスされると、ランタイムは通常例外をスローするため、これは問題を引き起こします。

本当に XML を に保存したい場合はBackgroundWorker、ファイル名とディレクトリを検証し、Textプロパティを中間オブジェクトに保存してから、 を設定してBackgroundWorkerを呼び出す必要がありRunWorkerAsyncます。

さらに、私の意見では、あなたのTransaction方法は、バックグラウンド スレッドを真に保証するほど時間のかかるものではありません。比較的古い PC でも、15 要素の XML ファイルを瞬く間に作成して保存することができます。ランタイムはおそらく、単にファイルをディスクに書き出すよりも、スレッド間でデータをマーシャリングすることに多くの時間を浪費します。ボタンクリックイベントハンドラーで作業を行うだけです。

于 2012-11-20T03:33:01.340 に答える
1

BackgroundWorker インスタンスへの参照が必要です。インスタンス化するときにクラスへの参照を渡します。
このようにインスタンス化します

BackgroundWorker worker = sender as BackgroundWorker;


次に、このように呼び出します

`worker.ReportProgress(...)`
于 2012-11-20T03:34:39.787 に答える