2

我在让程序中的主表单按我想要的方式运行时遇到问题。我正在使用 C#。在我最初的主窗体 (Form1) 上,我有一个运行长程序的命令按钮。在程序的中间,我希望用户能够返回到初始表单并单击一些新的复选框,这些复选框我将从 C# 程序中放置在初始表单上。下面的代码只是冻结了初始表单。我不需要让下面的代码完全工作。我只需要它来允许我访问使用命令按钮启动的程序中间的主要初始表单。

为此,我有一个调用计时器的无限 while 循环。这是正确的方法吗?我不需要下面的程序来工作。我只需要能够在程序中间访问那个初始表单。由于它不起作用,似乎它不是这样做的方法,但正确的方法是什么?

下面的代码运行下面的 OnTimedEvent 函数(方法)。该函数用于建立消息框,但我将其注释掉。我不需要该功能才能工作。它仅用于测试目的。我的目标是我需要初始主表单,以便在从命令按钮运行时输入更多信息。下面的函数运行了大约 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#。

总而言之,上面的代码是在命令按钮运行后获取主初始表单的正确方法吗?如果是,我做错了什么?如果这不是正确的方法,那是什么?

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

有任何想法吗?

4

4 回答 4

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

于 2013-04-24T18:54:39.637 回答
2

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

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

于 2013-04-24T18:56:44.890 回答
1

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

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

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

于 2013-04-24T18:57:48.763 回答
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();
于 2013-04-24T18:59:40.560 回答