程序运行时c#程序的初始形式不可用
本文关键字:程序 运行时 | 更新日期: 2023-09-27 18:10:56
我有一个问题,让我的程序中的主要形式运行,因为我想要的。我正在使用c#。在我最初的主要形式(Form1),我有一个命令按钮,运行一个长程序。在程序的中间,我希望用户能够回到初始表单,并单击我将在c#程序中放置在初始表单上的一些新复选框。下面的代码只是冻结了初始表单。我不需要得到下面的代码完全工作。我只需要它允许我在我用命令按钮开始的程序中间访问主要的初始形式。
要做到这一点,我有一个无限while循环调用计时器。这是正确的做法吗?我不需要下面的程序工作。我只需要能够访问在程序中间的初始形式。既然它不工作,似乎不是这样做的方式,但正确的方式是什么?
下面的代码运行下面的OnTimedEvent函数(方法)。这个函数用来显示一个Messagebox,但是我把它注释掉了。我不需要这个功能的工作。它只是用于测试目的。我的目标是,我需要初始的主表单,让我输入更多的信息,而它是从命令按钮运行。下面的函数运行了大约15次,我得到错误类型为"System"的异常。OutOfMemoryException'被抛出。
在aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent)
线上;
代码如下:
System.Timers.Timer aTimer;
// Create a timer with a one second interval.
aTimer = new System.Timers.Timer(100);
while (true)
{
// Hook up the event handler for the Elapsed event.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Only raise the event the first time Interval elapses.
aTimer.AutoReset = false;
aTimer.Enabled = true; // uncommented this now
//addded below
aTimer.Start();
}
我已经尝试了几种不同的方式,但主要形式总是只是冻结。我只是想能够选择的东西(复选框,例如)上的主要形式(Form1
),所以下面的代码可能不需要。上面的定时器调用下面的OnTimedEvent
。
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// MessageBox.Show("Hello World");
}
在网络上的许多地方,我已经看到(包括stackoverflow),我应该使用计时器来获得主要的初始表单是可用的,但上面的代码只是导致表单被冻结,我得到的栏在表单的顶部表明它没有响应。我使用Windows XP和Visual Studio 2008。如上所述,我正在使用c#。
总而言之,上面的代码是正确的方式来获得主要的,初始形式后,一个命令按钮已经运行?如果是,我做错了什么?如果这不是正确的方法,那什么才是?
顺便说一句,我问了一个与这个项目完全无关的问题
任何想法?
您应该直接删除while循环
System.Timers.Timer aTimer;
// Create a timer with a one second interval.
aTimer = new System.Timers.Timer(1000);
// Hook up the event handler for the Elapsed event.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Only raise the event the first time Interval elapses.
aTimer.AutoReset = false;
aTimer.Enabled = true; // uncommented this now
//addded below
aTimer.Start();
当你启动计时器时,它在一个单独的线程上运行。你的while循环只是一遍又一遍地启动计时器。
与system . timers . timer类
要做到这一点,我有一个无限while循环调用计时器。这是正确的做法吗?
。while循环阻塞UI线程,这反过来又使程序冻结。没有理由有while
循环,因为你已经使用计时器来触发事件。
在没有看到完整的实际代码的情况下很难说,但是在不锁定UI的情况下执行长时间运行的进程的传统方法是在c#中使用Threading。
你能在自己的线程中执行长时间运行的操作,这样你就不会锁定UI线程了吗?这里有一个教程:http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx
不要使用while循环。如果您想每秒运行一次OnTimedEvent
方法,请使用类似这样的内容:
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
myTimer.Interval = 1000; // 1000 ms is one second
myTimer.Enabled = true;
myTimer.Start();