2016-08-24 40 views
1

我需要在C#上打開一個表單,然後在5秒之後自動關閉它。事情是,我需要從打開的表單關閉表單,因爲我打開的表單有時候從另一個表單打開而不會自動關閉。如何打開一個窗體,然後關閉它在C#秒數後?

我已經試過這樣:

 private void button6_Click(object sender, EventArgs e) 
    { 
     GetNumber gtn = new GetNumber(); 
     gtn.Show(); 
     System.Threading.Thread.Sleep(6000); 
     gtn.Hide(); 
     gtn = null; 
    } 

但形式搞砸了的時候纔開始,同樣的事情發生時,我用一個定時器嘗試。 有人知道如何解決我的問題?

+1

您使用的是什麼版本的.Net,它是什麼意思「表格被搞砸」? –

回答

0

計時器將是正確的做法:

private void button6_Click(object sender, EventArgs e) 
{ 
    GetNumber gtn = new GetNumber(); 
    gtn.Show(); 

    System.Timers.Timer timer = new Timer(6000); 
    timer.Elapsed += (_, _2) => { Invoke((MethodInvoker)delegate { gtn.Close(); }); }; 
    timer.Start(); 
} 
+0

不應該調用調用是多餘的?如果我的記憶爲我服務,那麼定時器調用應該與主應用程序線程同步。 – IllidanS4

+0

@ IllidanS4只有當你使用System.Forms.Timer時,我沒有。但是,如果他們想要,OP可以走這條路。 – itsme86

+0

啊,對不起,我沒注意到。它應該是'new System.Timers.Timer'。 ☺另外它看起來'System.Timers.Timer'接受一個SynchronizingObject,它可以被設置爲當前窗體,所以Invoke可以被忽略。 – IllidanS4

2

正如itsme86說,定時器將工作你正在嘗試做的。如果您使用.Net 4.5或更高版本,則可以使用異步/等待功能。

在其核心,你需要釋放UI線程以繼續。您的Thread.Sleep將UI線程從佣金中提取出來。使用計時器或async/await允許UI線程啓動對話框並處理任何用戶操作。

private async void button6_Click(object sender, EventArgs e) 
{ 
    GetNumber gtn = new GetNumber(); 
    gtn.Show(); 
    await Task.Delay(6000); 
    gtn.Hide(); 
    gtn = null; 
} 
+0

不能做,我在VS 2008 –

+0

然後,我會去itsme86的答案。 –

相關問題