秒表应用程序启动但不会停止

时间:2015-06-13 17:32:50

标签: c# .net xamarin stopwatch

出于某种原因,我可以启动秒表,但是当我尝试单击停止按钮时,没有任何反应。

我有一些java编程的背景但是我被分配了一个项目,用一种我不知道的语言编写程序,所以我选择了C#。我对C#有一些了解,但如果有人可以帮我解决这个问题,我会非常感激。

First-Name:Last-Name:City:Home-Phone:Cell-Phone
Alice:Ashbury:Boston:111-111-1111:444-444-4444
Bob:Brown:Boston:222-222-2222:555-555-5555
Carol:Chaplin:Chicago:333-333-3333:666-666-6666

3 个答案:

答案 0 :(得分:2)

你的主题没有做任何事情。线程方法只运行一次。您至少需要一个循环来检查是否在某个时候单击了stopClicked

void Thread1()
{
    while (!stopClicked)
    {
        Thread.Sleep(100);
    }

    // Rest of the code to finish the timer.
}

其实我不太明白为什么你需要这个线程。只需在单击停止按钮时停止计时器。这里不需要单独的线程。它会引发各种各样的问题。

也没有必要这样做

System.Windows.Forms.Application.DoEvents();

无论如何,当剩下计时器方法时,UI将会更新。这不是好习惯。此外,System.Timers.Timer在一个单独的线程中调用,所以你实际上应该在这里得到一个跨线程异常。

答案 1 :(得分:1)

这是因为Thread1只运行一次,你应该使用忙等待循环来执行类似

的操作
void Thread1()
{
    while (true)
    {
        if (stopClicked)
        {
            timeLabel.Text = stopwatch.Elapsed.ToString();
            timer.Stop();
            timer.Enabled = false;
            timer.Dispose();
            Console.WriteLine("Timer stopped");
            stopwatch.Stop();
            Console.WriteLine("Stopwatch stopped");
            break;
        }
        Thread.Sleep(10);
    }
}

但您可以将整个逻辑移动到OnStopButtonClicked,并且不再需要使用线程

protected void OnStopButtonClicked (object sender, EventArgs e)
{
    timeLabel.Text = stopwatch.Elapsed.ToString ();
    timer.Stop ();
    timer.Enabled = false;
    timer.Dispose ();
    Console.WriteLine ("Timer stopped");
    stopwatch.Stop ();
    Console.WriteLine ("Stopwatch stopped");
}

答案 2 :(得分:0)

一个简单的解决方案是:

protected void OnStartButtonClicked (object sender, EventArgs e)
{
    stopwatch.Start ();

    // the next 3 lines could also be in the constructor function
    timer = new System.Timers.Timer();
    timer.Elapsed += new ElapsedEventHandler (timerTick);
    timer.Interval = 100;
    timer.Start ();
    Console.WriteLine ("Timer started");
}


protected void OnStopButtonClicked (object sender, EventArgs e)
{
    timer.Stop ();
    stopwatch.Stop ();
    Console.WriteLine ("Timer stopped"); 
}

void timerTick(object sender, EventArgs e)
{
    timeLabel.Text = stopwatch.Elapsed.ToString ();
}