2016-06-03 8 views
1

Ich bin neu in C# und ich habe ein Problem ... wenn ich meine Windows-Formularanwendung ausführen und Start-Taste, während der Laufzeit kann ich nichts mit dem Formular (schließen , minimieren, bewegen, ...) aber wenn es fertig ist, kann ich das Formular schließen.
Was soll ich tun, um es zu lösen?C# Windows Form Anwendung ist während der Laufzeit gesperrt

enter image description here

using System; 
using System.Threading; 
using System.Windows.Forms; 


namespace WindowsFormsApplication10 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void c1Button1_Click(object sender, EventArgs e) 
     { 
      for (int i = 0; i < 100; i++) 
      { 

       c1RadialGauge1.Value = i; 
       textBox1.Text = i.ToString(); 
       textBox1.Update(); 
       c1Gauge1.Refresh(); 
       Thread.Sleep(100); 

      } 

     } 
    } 
} 
+4

Jedes Mal, wenn der UI-Thread eine Langzeitoperation ausführt, kann er keine UI-Anforderungen verarbeiten. Dies wird auch als Nicht reagieren bezeichnet. Verwende 'BackgroundWorker'. –

Antwort

4

Da Ihre Button-Handler in dem UI-Thread ausgeführt wird, bis es fertig ist, UI-Blöcke und Sie können nicht mit, dass etwas anderes tun.

Eine Lösung für das wäre der Handler async und verwenden await ein Task.Delay() statt mit Thread.Sleep() zu machen:

private async void c1Button1_Click(object sender, EventArgs e) 
{ 
    c1Button1.Enabled = false; // avoid multiple clicks 
    for (int i = 0; i < 100; i++) 
    { 
     c1RadialGauge1.Value = i; 
     textBox1.Text = i.ToString(); 
     textBox1.Update(); 
     c1Gauge1.Refresh(); 
     await Task.Delay(100); 
    } 
    c1Button1.Enabled = true; // allow further clicks 
} 

Der Compiler übersetzt diesen Code in eine Zustandsmaschine. Unter dem Schlüsselwort await wird der Steuerungsfluss an den Aufrufer (die Benutzerschnittstelle) zurückgegeben und fortgesetzt, wenn Task.Delay() beendet ist. Während Task.Delay() ausgeführt wird, hat der UI-Thread Zeit, auf andere Ereignisse (z. B. Benutzerinteraktion) zu reagieren.

Ich habe zwei Zeilen hinzugefügt, um die Schaltfläche zu deaktivieren, während die ganze Sache ausgeführt wird, so dass der Benutzer nicht mehrere Male starten kann.

Dies ist jedoch nur mit .NET 4.5 oder neuer möglich. Lesen Sie this für weitere Informationen über async/await. Wenn Sie ein älteres .NET-Framework verwenden müssen, können Sie stattdessen BackgroundWorker verwenden.

+0

Es hat perfekt funktioniert ... Noch eine Frage: soll ich das bei jeder Aufgabe verwenden, die die App machen wird? – HBS

+1

@HBS, das hängt sehr von der Art der Aufgaben ab. Dies ist eine Designfrage, die ich nicht mit Kommentaren beantworten kann. Probieren Sie es aus und wenn Sie Probleme bekommen, können Sie bestimmte neue Fragen öffnen. –

Verwandte Themen