2016-11-19 5 views
1

Ich habe eine Installation, die Post-Checks ausführt. Was ich suche, ist, zu tun rufen Sie die FunktionFunktion ausführen bis erfolgreich

private void ApacheTest() 
{ 
    if(!File.Exists(HTTPD_PATH)) 
    { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
    } 
    else 
    { 
     StartApacheServer(); 
    } 
    if(ApacheRunning() == false) 
    { 
     amountdl.Text = "Apache Is Starting"; 
    } 
    else 
    { 
     amountdl.Text = "Apache Started"; 
    } 
} 

Was ich passieren soll, ist bis ApacheRunning() == true ich es diese Funktion behalten wollen laufen. Ist das in C# möglich?

+1

'ServiceController' hat einen eingebauten [' WaitForStatus'] (https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.waitforstatus (v = vs.110). aspx), wenn Sie den Apache-Dienst starten möchten. –

+0

Vielen Dank! Was ich gerade getan habe, war innerhalb von 'if (ApacheRunning() == false) {ApacheTest(); } 'Aber ich habe das Gefühl,' WaitForStatus' könnte der bevorzugte Weg sein, dies auszuführen. –

Antwort

-1

Versuchen:

private void ApacheTest() 
{ 
    if(!File.Exists(HTTPD_PATH)) 
    { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
    } 
    else 
    { 
     StartApacheServer(); 
    } 

    amountdl.Text = "Apache Is Starting"; 
    while(ApacheRunning() == false) 
    { 
     Task.Delay(1000); 
    } 

    amountdl.Text = "Apache Started";   
} 

Hier verwendete ich Task.Delay(1000) Zustand des Servers jeweils Sekunden zu überprüfen.

+1

Möchte eine 'Task.Delay' machen. –

+0

@GillBates Danke. Guter Punkt – Marusyk

+0

Ich habe eine Kombination aus deiner Methode und Sahuagin benutzt und jetzt versuche ich zu entscheiden, wer ich als Antwort schreiben werde. Meine Hauptsache bei seiner war, dass ich seine Exit-Methode mochte, weil ich die eigentliche Datei nicht finden konnte. –

1

Verwenden Sie eine while Schleife, aber auch einige andere Änderungen.

private void ApacheTest() { 
    if (!File.Exists(HTTPD_PATH)) { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
     return; 
    } 

    amountdl.Text = "Apache Is Starting";  
    StartApacheServer(); 

    while (ApacheRunning() == false) { 
     // spin 
    } 

    amountdl.Text = "Apache Started"; 
} 

Sie sollten die Funktion beenden, wenn „Apache nicht gefunden wird“, anstatt weiterhin (return Anweisung).

Sagen Sie "Apache beginnt" so schnell wie möglich und keine Notwendigkeit, es wieder und wieder zu setzen.

+0

Was ist der Zweck der Rückkehr in den Fehler-Exit? Immer noch neu in C#, also hasse ich es nicht zu wissen, was ich überhaupt mache, aber ich merke, dass viele Praktiken, die ich in PHP verwende, nicht in C# funktionieren. –

+0

@MorganGreen Verlässt die Funktion. Wenn Sie feststellen, dass eine erforderliche Bedingung nicht erfüllt wurde, sodass der Server überhaupt nicht gestartet werden kann, müssen Sie den Vorgang beenden. Eine andere Möglichkeit ist das Auslösen einer Ausnahme oder das Zurückgeben eines Erfolgs-/Fehlerwerts. (Beachten Sie, dass die Funktion ohne die return-Anweisung entweder eine Endlosschleife ausführt oder "Apache Started" ausgibt, wenn Apache nicht gefunden wird, von denen beide nicht gut sind.) –

+0

Danke für die Eingabe. Ich habe deine Antwort aufgefrischt, aber weil ich mehr aus Megatrons verwendet habe, habe ich seine als beste Antwort ausgewählt! Hätte beides kombiniert, wenn ich hätte können! –

0

Vergessen Sie nicht, Rückmeldung innerhalb der If-Block!

private void ApacheTest() 
{ 
    if(!File.Exists(HTTPD_PATH)) 
    { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
     return; 
    } 
    else 
    { 
     StartApacheServer(); 
    } 

    amountdl.Text = "Apache Is Starting"; 

    while(ApacheRunning() == false) 
    { 
     Thread.Sleep(50); 
    } 

    amountdl.Text = "Apache Started"; 
} 
+0

Würde 'System.Thread.Sleep (5)' nicht zu einer nicht reagierenden Systemsteuerung führen? –

+0

Ja, Morgan. Sowohl Task.Delay als auch Thread.Sleep führen zu einer nicht reagierenden Benutzeroberfläche, ohne async/await zu verwenden. Ich habe eine neue Antwort dazu hinzugefügt. – taydogan

1

Dies könnte funktionieren, aber es kann auch Ihre Benutzeroberfläche (Fenster) einfrieren.

private void ApacheTest() 
{ 
    if(!File.Exists(HTTPD_PATH)) 
    { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
    } 
    else 
    { 
     StartApacheServer(); 
    } 

    amountdl.Text = "Apache Is Starting"; 

    while(ApacheRunning() == false) 
    { 
     Thread.Sleep(200); 
    } 

    amountdl.Text = "Apache Started"; 
} 

Wenn das passiert, können Sie so etwas wie dies versuchen:

private void ApacheTest() 
{ 
    if(!File.Exists(HTTPD_PATH)) 
    { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
     return; 
    } 

    amountdl.Text = "Apache Is Starting"; 

    Task.Factory.StartNew(() => 
     { 
      while(ApacheRunning() == false) 
      { 
       Thread.Sleep(200); 
      } 
      amountdl.Text = "Apache Started"; 
     }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); // nicked from [the MSDN forums][1] 
} 

Auf diese Weise wird die Funktion verlassen und "fire and forget" die Aufgabe des Wartens und den Text zu aktualisieren.

0

Wenn Sie nicht möchten, dass Ihr Formular nicht gesperrt wird, können Sie die Funktion "async/await" mit "Task.Delay" verwenden.

async private void ApacheTest() 
{ 
    if(!File.Exists(HTTPD_PATH)) 
    { 
     amountdl.Text = "Apache Not Found! Installation Corrupt!"; 
     return; 
    } 

    amountdl.Text = "Apache Is Starting"; 
    StartApacheServer(); 

    while(ApacheRunning() == false) 
    { 
     await Task.Delay(50); 
    } 

    amountdl.Text = "Apache Started"; 
} 
+0

'async void' ist im Grunde eine Autobahn zur Hölle; 'async Task' wäre in fast allen Fällen der richtige Weg (unabhängig davon, wie der Benutzer es am Ende benutzen wird). – sunside

Verwandte Themen