0
    private void btnUpdate_Click(object sender, EventArgs e)
    {                 
      bgWorker.RunWorkerAsync();                                
    }

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {          
        BackUpDatabase.BackUp(this.txtPath.Text);
        for (int i = 0; i <= 100; i++)
        {
            // Report progress to 'UI' thread
            bgWorker.ReportProgress(i);
            // Simulate long task
            System.Threading.Thread.Sleep(100);
        }
    }

    private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        lblProgress.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
    }

コードは機能していますが、進行状況が正確な時間プロセスではないことを疑います。私はここで何かを逃していますか?

4

1 に答える 1

0

あなたの質問は少し漠然としていますが、うまくいきません。

2 つのバックグラウンド ワーカーが必要なように思えます。1 つは実際のバックアップを実行し、もう 1 つはリアルタイムで時間を報告します。

幸いなことに、バックグラウンド スレッドで実行されるタイマーがあります。System.Timers.Timer.

作業を行うためのスレッドが既に 1 つ設定されているため、タイマーを作成し、それを開始/更新/停止するだけです。

コードがどのように機能するかを次に示します。

private Timer _Timer;
private DateTime _Start;
private void InitTimer()
{
    _Start = DateTime.Now;
    _Timer = new Timer(100);
    _Timer.AutoReset = false;
    _Timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed);
    _Timer.Start();
}
private void Timer_Elapsed(object sender, ElapsedEventArgs  e)
{
    TimeSpan diff = DateTime.Now - _Start;
    this.Invoke(new MethodInvoker(delegate()
    {
        lblProgress.Text = String.Format("Time: {0}", diff);
    }));
}
//starts the worker thread
private void btnUpdate_Click(object sender, EventArgs e)
{
    InitTimer();
    bgWorker.RunWorkerAsync();
}
//Does the backup
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    BackUpDatabase.BackUp(this.txtPath.Text);
}
//Stops the timer when the backup finishes
private void bgWorker_WorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{

    _Timer.Stop();
}

私はこのコードをテストしておらず、おそらくこれでベースから外れているかもしれません:)しかし、楽しんでください:)

編集:

これについてもう少し考えてみると、OPがパーセンテージを取得したい場合は、バックアップをステップに分割して手動で報告する必要があります。

于 2013-06-17T05:20:42.170 に答える