1

私はいくつかのタスクを実行するために使用しているバックグラウンド ワーカーを持っています。期待どおりに動作します。ただし、追加して bw を開始し、ページの読み込み後 10 秒のようにカウントするタイマーがあります。timer.Interval を 10000 に設定しました。タイマーには以下のようにティック イベントがあります。

 private DateTime dateETA;
    private void TimerEventHandler(object sender, EventArgs e)
            {
                while (bw.CancellationPending ==false)
                {
                    if (timerPro.Enabled == true)
                    {
                         dateETA = Convert.ToDateTime("1/1/0001 00:00:00");
                        dateETA = dateETA.AddMilliseconds(timerPro.Interval);
                        lblETA.Visible = true;
                        lblETA.Text = "Elapsed Time : " + Convert.ToString(dateETA.TimeOfDay);
                       // SetText("timer");
                    }
                }
            }

私のバックグラウンド ワーカー非同期はページ コンストラクター メソッド上にあるため、ロード時に実行されます。以下のように

  if (bw.IsBusy != true)
            {
                this.btnPause.Enabled = true;
                this.btnStop.Enabled = true;
                btnStart.Enabled = false;


               // timerPro.Start();
                bw.RunWorkerAsync();

            }

タスクと一緒にタイマーを開始したかったので、 bw.async の前に置きました。次に、バックグラウンド ワーカーの dowork メソッドの前または内部に置くと、タイマー ティック イベントが発生しないことに気付きました。bw スレッドがイベントの発生をブロックしている可能性があると考えた後、dowork 内で以下のような呼び出しメソッドを使用して、タイマーを開始するか、タイマーの tick イベントをトリガーします。

 this.Invoke((MethodInvoker)(() => { timerPro.Enabled = true; }));

それでも発火しません。私は混乱しており、助けや代替手段をいただければ幸いです。

4

1 に答える 1

3

バックグラウンドワーカーがそのことをしている間、経過タイマーを実行したいだけだと思いますか?

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();

    private void Form1_Load(object sender, EventArgs e)
    {
        timerPro.Interval = 1000;
        timerPro.Tick +=new EventHandler(TimerEventHandler);
        SW.Start();
        timerPro.Start();
        bw.RunWorkerAsync();
    }

    private void TimerEventHandler(object sender, EventArgs e)
    {
        lblETA.Visible = true;
        TimeSpan TS = SW.Elapsed;
        string elapsed = String.Format("{0}:{1}:{2}", TS.Hours.ToString("00"), TS.Minutes.ToString("00"), TS.Seconds.ToString("00"));
        lblETA.Text = "Elapsed Time : " + elapsed;
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        // ... do some work ...
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        timerPro.Stop();
    }

}
于 2013-11-13T09:12:07.133 に答える