Win form应用程序在启动时冻结

本文关键字:冻结 启动 form 应用程序 Win | 更新日期: 2023-09-27 17:57:53

让我首先承认,我是一个相当环保的程序员,但我正处于水深火热之中,试图找出我的应用程序出了什么问题。

到目前为止,目标是在单击按钮时启动计时器,并在文本框中持续显示经过的时间。

也许有更好的方法来实现这一点,但幽默一下,我练习创建事件并在程序中使用它们。

当我启动代码时,我看到的是它只是冻结,永远不会恢复,我需要用任务管理器结束应用程序。

任何关于我可能做错了什么以及如何解决的建议都将不胜感激。

// see clock class below containing delegate and event instantiation
public class Clock
{
    public delegate void TimeChangedHandler(object clock, TimeEventArgs timeInfo);
    public TimeChangedHandler TimeChanged;
    public void RunClock()
    {
        TimeEventArgs e = new TimeEventArgs();//initialize args
        while (e.keepCounting)
        {
            Thread.Sleep(1000);
            e.EndTime = DateTime.Now;
            if (e.StartTime != e.EndTime)
            {
                e.duration = e.EndTime.Subtract(e.StartTime);
            }
            if (TimeChanged != null)
            {
                TimeChanged(this, e);
            }

        }
    }

//see timeevent args description below:
public class TimeEventArgs : EventArgs
{
    public TimeSpan duration;
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public bool keepCounting = false;
    public TimeEventArgs()
    {
        StartTime = DateTime.Now;
        EndTime = DateTime.Now;
        keepCounting = true;
    }
}

//See form class below:
  public partial class TimeApp : Form
{

    public TimeApp()
    {
        InitializeComponent();
    }
    private void startStopButton_Click(object sender, EventArgs e)
    {
        var theClock = new Clock();
        var timeApp = new TimeApp();
        timeApp.Subscribe(theClock);
        theClock.RunClock();
    }
    public void Subscribe(Clock theClock)
    {
        theClock.TimeChanged += new Clock.TimeChangedHandler(NewTime);
    }
    public void NewTime(object theClock, TimeEventArgs e)
    {
        displayBox.Text = e.duration.Hours.ToString() + ":"
            + e.duration.Minutes.ToString() + ":" + e.duration.Seconds.ToString();
    }

}

Win form应用程序在启动时冻结

您的RunClock方法会阻塞UI(因为Thread.Sleep(1000);调用),因此无法停止。

您应该考虑将Windows.Forms.Timer添加到表单中,并使用它来驱动时钟,而不是循环。

您在调用Thread.Sleep(1000)时挂起了主(UI)线程,这就是为什么您的应用程序没有响应的原因。

使用Timer(而不是Thread.Sleep()),并将任何处理/长时间运行的代码衍生为BackgroundWorker,用于您需要进行的任何处理。这样,您的UI将保持响应。