2016-08-24 9 views
1

Ich muss ein Formular auf C# öffnen und dann schließen es automatisch nach, sagen wir, 5 Sekunden .. Die Sache ist, ich brauche das Formular geschlossen von der Form, die geöffnet wurde, weil die Form, die ich öffne, manchmal ist aus einem anderen Formular geöffnet, ohne automatisch geschlossen zu werden.Wie öffnet man ein Formular und schließt es dann nach X Sekunden in C#?

ich das versucht habe:

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

Aber die Form wurde vermasselt, als es begann, geschah gleich, wenn ich mit einem Timer versucht. Kann jemand mein Problem lösen?

+1

Welche Version von .Net verwenden Sie und was bedeutet es für "die Form zu vermasseln"? –

Antwort

0

Ein Timer wäre der richtige Ansatz sein:

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

Sollte der Aufruf von Invoke nicht redundant sein? Timer-Anrufe sollten mit dem Haupt-App-Thread synchronisiert werden, wenn mein Gedächtnis mir dient. – IllidanS4

+0

@ IllidanS4 Nur wenn Sie einen System.Forms.Timer verwenden, was ich nicht getan habe. Aber die OP könnte diesen Weg gehen, wenn sie wollten. – itsme86

+0

Ah, tut mir leid, das habe ich nicht bemerkt. Es sollte dann 'new System.Timers.Timer' sein. ☺ Es sieht auch aus, dass "System.Timers.Timer" ein SynchronizingObject akzeptiert, das auf das aktuelle Formular gesetzt werden kann, sodass Invoke weggelassen werden kann. – IllidanS4

2

Wie itsme86 sagte, Timer würde arbeiten, was Sie versuchen zu tun. Wenn Sie in .Net 4.5 oder höher sind, können Sie die async/await-Funktionen verwenden.

Im Kern müssen Sie den UI-Thread freigeben, um weiter zu arbeiten. Ihr Thread.Sleep setzt den UI-Thread außer Kraft. Wenn Sie einen Timer oder async/await verwenden, kann der Benutzer den Dialog starten und alle Benutzeraktionen bearbeiten.

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

Kann nicht, ich bin auf VS 2008 –

+0

Dann würde ich mit itsme86's Antwort gehen. –

Verwandte Themen