程序运行时,C#程序的初始形式不可用

时间:2013-04-24 18:53:27

标签: c#

我遇到问题,让我的程序中的主窗体按我的意愿运行。我正在使用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();
}

我已经尝试过几种不同的方式,但主要的Form总是冻结。我只是希望能够在主窗体(Form1)上选择(例如复选框),因此可能不需要以下代码。上面的计时器会调用OnTimedEvent,如下所示。

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
  // MessageBox.Show("Hello World");
}

在网上的很多地方,我已经看到(包括stackoverflow),我应该使用计时器来使主要的初始Form可用,但上面的代码只会导致Form冻结,我得到顶部的栏形式表明它没有响应。 我正在使用Windows XP和Visual Studio 2008.如上所述,我使用的是C#。

总结一下,上面的代码是在命令按钮运行后获取main,Initial表单的正确方法吗?如果是的话,我做错了什么?如果这不是正确的方法,那是什么?

顺便说一下,我问了一个关于这个项目的完全不相关的问题here

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您应该只删除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

答案 1 :(得分:2)

  

要做到这一点,我有一个无限的while循环调用计时器。这是正确的方法吗?

没有。 while循环阻止UI线程,这反过来使程序冻结。由于您已经使用计时器来触发事件,因此没有理由拥有while循环。

答案 2 :(得分:1)

在没有看到完整的,实际的代码的情况下,很难说,但是在不锁定UI的情况下执行长时间运行的流程的传统方法是在C#中使用线程。

你可以在自己的线程中执行长时间运行的操作,这样就不会锁定UI线程吗?

这是一个教程:http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

答案 3 :(得分:1)

不要使用while循环。如果您想每秒运行一次OnTimedEvent方法,请使用以下内容:

Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
myTimer.Interval = 1000; // 1000 ms is one second
myTimer.Enabled = true;
myTimer.Start();