1
    private void time_counter_Tick(object sender, EventArgs e)
    {
        secs += 1;
        if (secs == 60)
        {
            secs = 0;
            mins += 1;
            if (mins == 60)
            {
                mins = 0;
                hrs += 1;
            }
        }
        time_counter_lbl.Text = getCurrentTimeString();
    }

    private void startTheCounter()
    {
        secs = mins = hrs = 0;

        time_counter.Start();
        time_lbl.Visible = true;
        time_counter_lbl.Visible = true;
    }

    private void stopTheCounter()
    {
        time_counter.Stop();
    }

    private string getCurrentTimeString()
    {
        string sec, min, hr;
        sec = min = hr = "";
        if (secs < 10)
            sec = "0" + secs.ToString();
        else
            sec = secs.ToString();
        if (mins < 10)
            min = "0" + mins.ToString();
        else
            min = mins.ToString();
        if (hrs < 10)
            hr = "0" + hrs.ToString();
        else
            hr = hrs.ToString();

        return hr + ":" + min + ":" + sec;
    }

私のアプリケーションでは、db 呼び出しがあります。同時に経過時間を表示したい。しかし、時間ラベルは更新されていません。これを解決するために別のスレッドでこれを修正する方法を教えてください。

4

1 に答える 1

2

タイマーはラベルを更新できる必要があり、すべてのラベル更新コードを time_counter_Tick() 内に配置します。

BackgroundWorker の使用方法を知りたい場合は、数年前に投稿した質問を参照してください。

WPF での簡単なスレッド化

秘訣は、UI ロジックを UI スレッドで実行する必要があることです。これを他の方法よりも簡単にする方法が提供されていますが、それらを使用するのは難しい場合があります。これが私が過去にそれを行った方法です:

まず、Dispatcher.Invoke メソッドにフィードできるデリゲートを宣言する必要があります。

private delegate void UIDelegate();

次に、バックグラウンド ワーカーのセットアップを取得し、その RunWorkerAsync メソッドを呼び出します。

BackgroundWorker loadWorker = new BackgroundWorker();
loadWorker.DoWork += new DoWorkEventHandler(loadWorker_DoWork);
loadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(loadWorker_RunWorkerCompleted);
loadWorker.RunWorkerAsync();

次に、UI 要素を更新するには、ディスパッチャーを呼び出す必要があります。

private void changeStatusLabel(string status)
{
    progressLabel.Dispatcher.Invoke(new UIDelegate(delegate
    {
        progressLabel.Content = status;
    }));
}

これらはより大きなメソッドから切り取られており、少し最適化できる可能性があります。それでも、それはあなたに出発点を与えるでしょう。

于 2012-11-23T09:09:24.070 に答える