簡體   English   中英

C#程序的初始形式在運行時不可用

[英]Initial Form of C# program unavailable while the program is running

我在使程序中的主窗體能夠按需運行時遇到問題。 我正在使用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)我應該使用計時器來使主要的初始Form可用,但是上面的代碼只是導致Form被凍結,並且在表單的頂部出現了橫條。表示它沒有響應。 我正在使用Windows XP和Visual Studio2008。如上所述,我正在使用C#。

總而言之,上面的代碼是在命令按鈕運行后獲取main,Initial表單的正確方法嗎? 如果是的話,我做錯了什么? 如果這不是正確的方法,那是什么?

順便說一句,我在這里問了一個與此項目完全無關的問題

有任何想法嗎?

你應該簡單地刪除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#中使用線程。

您可以在自己的線程中執行長時間運行的操作,以便不鎖定UI線程嗎?

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

不要使用while循環。 如果要OnTimedEvent運行一次OnTimedEvent方法,請使用類似以下的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM