【问题标题】:Stopwatch always outputs 00:00:00:00秒表总是输出 00:00:00:00
【发布时间】:2018-11-24 09:45:35
【问题描述】:

在我的 WPF 程序中有一个带有此代码隐藏的按钮:

**Outside the Click event:**
bool started = false;

**In the Click Event:**
if (started == false)
{
    started = true;

    btnStart.Content = "Stop";

    //---------Clock Code-------------
    stopwatch.Start();
}
else
{
    started = false;
    btnStart.Content = "Start";

    //---------Clock Code------------

    stopwatch.Stop();
    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopwatch.Elapsed;

    // Format and display the TimeSpan value.
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", 
      ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    tbDuration.Text = elapsedTime;
}

但是如果我启动程序并按下按钮,它总是显示 0。 我无法调试它,因为 Visual Studio 崩溃了...

我做错了什么?

或者你有更好的方法来做到这一点? 我只是想测量两次按下之间的时间并将其输出到文本框。

我还希望在文本框中实时监控时间。

谢谢

【问题讨论】:

  • 如果此代码在您的按钮的 Click() 事件处理程序中,则 started == false 条件将始终运行,因为您在之前声明并设置了 started 变量 - 这也意味着时刻如果您离开该方法,变量就会超出范围,因此您下次进入该方法时不会保留任何状态信息。
  • 你需要使用 backgroundjob 来保持 ui 更新
  • @slugster 谢谢你的回答,开始的地方放错了。它在点击事件之外。
  • I can't debug it, because Visual Studio crashes... 这是您的第一个问题,您需要弄清楚这一点,当您需要做的只是调试应用程序时,您不能一直问简单的问题。我认为与其编写程序,不如先弄清楚 Visual Studio 崩溃的原因
  • 另外,如果您的秒表不是实例成员,那么您将无法测量时间

标签: c# wpf stopwatch


【解决方案1】:

假设您的代码看起来像这样,它可以正常工作:

    public Stopwatch stopwatch = new Stopwatch();
    bool started = false;

    private void button1_Click(object sender, EventArgs e)
    {

        if (started == false)
        {
            started = true;

            button1.Text = "Stop";

            //---------Clock Code-------------

            stopwatch.Start();




        }
        else
        {
            started = false;
            button1.Text = "Start";

            //---------Clock Code------------

            stopwatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopwatch.Elapsed;

            // Format and display the TimeSpan value.
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);

            MessageBox.Show(elapsedTime);
        }
    }

【讨论】:

  • 是的。我的错误是,我需要公开 StopWatch 而不是将其放入 Click Event
  • 您是否也有解决方案如何将实时时间显示到文本框中?
  • 您需要启动一个单独的线程以避免锁定 UI。
【解决方案2】:

解决方案:(来自@TheGeneral) 将秒表放入实例成员中:

private Stopwatch stopwatch = new Stopwatch();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多