2016-11-19 11 views
1

私はポストチェックを実行するインストールがあります。私は何をしているよ、私は起こるしたい何正常に機能するまで実行する

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"; 
    } 
} 

機能を呼び出すされている、私はそれがこの機能を実行し続けるようにしたいApacheRunning() == trueまでです。これはC#で可能ですか?

+1

は 'ServiceController'は[' WaitForStatus'(https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.waitforstatus(V = vs.110)に内蔵されています。 aspx)を使用して、Apacheサービスを開始します。 –

+0

ありがとう!私がやったことは 'if(ApacheRunning()== false){ApacheTest();}の中にあった。 } 'しかし、私は' WaitForStatus'がこれを実行するための好ましい方法かもしれないという気持ちがあります。 –

答えて

-1

試してみてください。

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";   
} 

は、ここで私は、各秒サーバーの状態をチェックするために Task.Delay(1000)を使用。

+1

'Task.Delay'をしたいかもしれません。 –

+0

@GillBatesありがとうございます。良い点 – Marusyk

+0

あなたの方法とSahuaginの組み合わせを使用しました。私が選択した答えとして投稿する人を決定しようとしています。彼との私の主なことは、実際のファイルを見つけることができなかった彼の出口方法が好きだったかということでした。 –

1

whileループを使用してください。

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"; 
} 

あなたは「Apacheが見つからない」場合、関数を終了するのではなく、(return文を)続けるべきです。

できるだけ早く "Apacheが起動しています"と言って、何度も何度も設定する必要はありません。

+0

エラー出口での返品の目的は何ですか?まだC#の新機能なので、私が何をやっているのか知らないのは嫌いですが、PHPで使う多くの習慣がC#では動作しないことに気付いています。 –

+0

@MorganGreen機能を残します。サーバーを最初に起動できないなどの条件が満たされていないと判断した場合は、終了する必要があります。別の可能性は、例外をスローするか、成功/失敗の値を返すことです。 (return文がなければ関数は無限にループするか、apacheが見つからない場合は "Apache Started"を表示し、どちらも良いとは限りません)。 –

+0

ありがとうございます。私はあなたの答えをアップアップしましたが、私がメガトロンをより使い果たしたので、彼を最高の答えとして選んだのです!もし私が持つことができたら、両方を組み合わせてクレジットを与えただろうか! –

0

ifブロック内のreturn文を忘れないでください!

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

'System.Thread.Sleep(5)'は応答しないコントロールパネルを引き起こしませんか? –

+0

はいモーガン。 Task.DelayとThread.Sleepの両方が、非同期/待機を使用しないで応答のないUIを引き起こします。私はこれについて新しい答えを加えました。 – taydogan

1

これは機能する可能性がありますが、UI(ウィンドウ)がフリーズすることもあります。

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"; 
} 

その場合、あなたはこのような何かしてみてください可能性があります

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] 
} 

そのように、関数が終了し、「火と忘れて」テキストを待っていると、更新の作業をします。

0

フォームをロックしたくない場合は、 "Task.Delay"で "async/await"機能を使用できます。

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'は基本的に地獄のハイウェイです。ほとんどの場合、 'async Task'は正しい方法です(ユーザーが最後にどのように使用するかにかかわらず)。 – sunside

関連する問題