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();
}
}
您的RunClock
方法会阻塞UI(因为Thread.Sleep(1000);
调用),因此无法停止。
您应该考虑将Windows.Forms.Timer
添加到表单中,并使用它来驱动时钟,而不是循环。
您在调用Thread.Sleep(1000)
时挂起了主(UI)线程,这就是为什么您的应用程序没有响应的原因。
使用Timer
(而不是Thread.Sleep()
),并将任何处理/长时间运行的代码衍生为BackgroundWorker
,用于您需要进行的任何处理。这样,您的UI将保持响应。