运行功能直到成功

时间:2016-11-19 17:19:12

标签: c#

我有一个运行后检查的安装。我要做的是调用函数

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#中是否可能?

5 个答案:

答案 0 :(得分: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正在开始"尽快,不需要一遍又一遍地设置它。

答案 1 :(得分: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]
}

这样,该函数将退出并“触发并忘记”等待和更新文本的任务。

答案 2 :(得分: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";
}

答案 3 :(得分:0)

如果您不希望锁定表单,则可以使用“async / await”功能和“Task.Delay”。

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

答案 4 :(得分:-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)每秒检查一次服务器状态。