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

C# 程序运行时,C程序的初始形式不可用,c#,C#,我在让程序中的主窗体按我想要的方式运行时遇到问题。我使用的是C。在我最初的主窗体Form1上,我有一个运行长程序的命令按钮。在程序的中间,我希望用户能够回到最初的形式,点击一些新的复选框,我将把它放在C程序中的初始表单上。下面的代码只是冻结了初始表单。我不需要让下面的代码完全工作。我只需要它来允许我在命令中间开始的程序中间访问主要的初始形式。< /P> 为此,我有一个调用计时器的无限while循环。这是正确的方法吗?我不需要下面的程序来工作。我只需要能够在程序中间访问最初的表单。既然它不起作用,

我在让程序中的主窗体按我想要的方式运行时遇到问题。我使用的是C。在我最初的主窗体Form1上,我有一个运行长程序的命令按钮。在程序的中间,我希望用户能够回到最初的形式,点击一些新的复选框,我将把它放在C程序中的初始表单上。下面的代码只是冻结了初始表单。我不需要让下面的代码完全工作。我只需要它来允许我在命令中间开始的程序中间访问主要的初始形式。< /P> 为此,我有一个调用计时器的无限while循环。这是正确的方法吗?我不需要下面的程序来工作。我只需要能够在程序中间访问最初的表单。既然它不起作用,它似乎不是这样做的方式,但什么是正确的方式

下面的代码运行下面的OnTimedEvent函数方法。该函数用于设置Messagebox,但我对此进行了注释。我不需要这个功能来工作。它仅用于测试目的。我的目标是,我需要初始主窗体,以便在从命令按钮运行时输入更多信息。下面的函数运行了大约15次,我得到了错误

引发了“System.OutOfMemoryException”类型的异常

在aTimer.Appead+=新的ElapsedEventHandlerOnTimedEvent行上

代码如下:

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");
}
在web上的许多地方,包括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循环只是一次又一次地启动计时器

为此,我有一个调用计时器的无限while循环。这是正确的方法吗


不可以。while循环会阻塞UI线程,从而使程序冻结。没有理由使用while循环,因为您已经在使用计时器触发事件。

如果看不到完整的、实际的代码,很难说,但是执行长时间运行的过程而不锁定UI的传统方法是在C中使用线程

您可以在自己的线程中执行长时间运行的操作,以便不锁定UI线程吗


这里有一个教程:

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

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

仅供参考,尽管真的{…}从来都不是个好主意。浪费CPU周期。还有其他什么都不做的方法。哈哈,我知道,但我只是从最初的帖子中抄来的。我会把它改一下,以供参考@我试过使用你的代码,但没用。我把时间增加到60秒60000。我在调试器中运行了它。这会有所不同吗?我们需要更多的背景。如果将此部分放在main方法中,它将不会阻止UI线程。@RubenJ创建命令按钮后,我将所有代码放在函数private void RunItButton\u Clickobject sender,EventArgs eAs中,我向RubenJ指出:我尝试使用您的代码,但它不起作用。我把时间增加到60秒60000。我在调试器中运行了它。这会有所不同吗?我将您的代码部分更改为以下内容,但它只是不停地运行。我把时间改为60000,也就是60秒。。。我在第一行的2个位置添加了Systems.Timers`System.Timers.Timer myTimer=new System.Timers.Timer;myTimer.Appead+=新的ElapsedEventHandlerOnTimedEvent;myTimer.Interval=60000;//1000毫秒是一秒钟的myTimer.Enabled=true;myTimer.Start`@吉姆,你得设法控制住这个节目。你在哪个站台?WPF?Winforms?控制台应用程序?你说的暂停程序是什么意思?我有一个功能齐全的Windows应用程序,所以它不是一个控制台应用程序。“我怎么能说呢?”吉姆,我想我不太清楚你说的是什么意思,只是没有停下来。它到底起作用了吗?你的消息框弹出了吗?我有一个消息框出现在那段代码运行之后,只是进入消息框而不做任何事情。。。。珀赫
我认为这是错误的。我希望我的初始表单窗口将可用并可单击60秒。是这样吗?如果我的所有代码都在一个线程中,那么线程如何与UI通信,反之亦然?感谢您的建议…在Dispatcher上使用BeginInvoke,如下所示: