-4

1秒ごとに実行したい関数があり、そのほかに他の関数があります。他の関数でスレッドを使用し、ウィンドウクラッシュを回避しているため、Backgroundworkerを使用して、次のように実行すると思われる関数を呼び出すことにしました。

Main()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync();
}

public void worker_DoWork(object sender, EventArgs e)
{
    AutoChecking(); // thats a function should Run on Background every 1 second
}

public void AutoChecking()
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
    {
        if (SystemisGood == true)
            Updatecolor.Fill = Green;
        else
            Updatecolor.Fill = Red;
    }));
}

ただし、この機能は 1 秒ごとに機能する理由または解決策が 1 回しか機能せず、backgroundworker にとどまります ?! PS: タイマーを使いたくない...

4

1 に答える 1

1

タイマーは非常に軽量で定期的にメッセージを送信するだけなので、タイマーを使用しないのは無駄ですが、タイマー コード自体によって行われるのと同じように、オーバーヘッドの少ないポーリング ループを使用して時間をチェックすることで、目的を達成できます。 . 例えば:

Main()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync();
}

bool exitBGThread = false;

public void worker_DoWork(object sender, EventArgs e)
{
    TimeSpan interval = new TimeSpan(0, 0, 1);
    while (!exitBGThread)
    {
        DateTime start = DateTime.Now;
        AutoChecking();  // thats a function should Run on Background every 1 second

        while (!exitBGThread)
        {
            DateTime cur = DateTime.Now;
            if (cur - start >= interval)
                break;
            Thread.Sleep(100);
        }
    }
}

public void AutoChecking()
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
    {
        if (SystemisGood  == true )
             Updatecolor.Fill = Green;
        else 
             Updatecolor.Fill = Red;
    }));
}

実際に exitBGThread を使用した場合は lock { } を使用する必要があるため、これは少し単純化されていますが、アイデアは得られます。

于 2013-02-06T04:02:51.757 に答える