0

.NET バックグラウンドワーカーで while ループを実行しています。Timers.Timer が 0 になったらループを終了させたいです。

問題は、別のスレッド (backgroundworker) で作業しているため、タイマーを同じスレッドでインスタンス化する必要があることです。したがって、プライベート ブール値の timer_Elapsed を設定することはできません。ブールスローイベントの参照を与える方法を私は知りません。

コード例:

private bool timer_Elapsed = false;

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Timers.Timer timer = new System.Timers.Timer();
        Set_Timer(timer);

        timer.Start();

        while(timer_Elapsed) //Has to be a boolean that indicates if timer elapsed
        {
            this.Do_Proces();
        }
    }

    private void Set_Timer(System.Timers.Timer timer)
    {
        timer.Interval = 200;
        timer.Elapsed += new ElapsedEventHandler(timer_ElapsedEvent);
    }

    private void timer_ElapsedEvent(object source, ElapsedEventArgs e)
    {
        timer_Elapsed = true; //I can't set my private boolean since it got instantiated in another thread
    }

コード内の特定の質問。私はこの種のもので新しいです。助言がありますか?前もって感謝します

編集:明確にするために、Do_Proces() を 200 ミリ秒間実行したいのですが、その時間が経過したら停止させたいと思います。200 ミリ秒後に停止したら、backgroundWorker で生成されたデータで GUI を更新したいと考えています。次に、ユーザーがプロセスを停止するかどうかを確認します。そうでない場合は、もう一度実行します.スレッドを再起動する必要があるため、タイマーを使用します。これはメインスレッドにも影響を与え、ユーザーに影響を与えますひどく経験します。

4

1 に答える 1

4

タイマーは、ここに記載されている以外の目的を果たしていますか? そうでない場合は、BackgroundWorker メソッドの開始時に現在の時刻を記録し、while ループの条件を変更して、必要な時間が経過したかどうかを確認することができます。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    TimeSpan timeout = TimeSpan.FromMinutes(5);
    DateTime start_time = DateTime.Now;

    while(DateTime.Now - start_time < timeout)
    {
        this.Do_Proces();
    }
}
于 2013-01-02T01:02:28.573 に答える