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 回答