2016-07-07 7 views

Antwort

7

Der Code für ServiceController.WaitForStatus ist:

public void WaitForStatus(ServiceControllerStatus desiredStatus, TimeSpan timeout) 
{ 
    DateTime utcNow = DateTime.UtcNow; 
    this.Refresh(); 
    while (this.Status != desiredStatus) 
    { 
     if (DateTime.UtcNow - utcNow > timeout) 
     { 
      throw new TimeoutException(Res.GetString("Timeout")); 
     } 
     Thread.Sleep(250); 
     this.Refresh(); 
    } 
} 

Dies kann zu einer Aufgabe zugrunde, api umgewandelt werden das mit folgenden:

public static class ServiceControllerExtensions 
{ 
    public static async Task WaitForStatusAsync(this ServiceController controller, ServiceControllerStatus desiredStatus, TimeSpan timeout) 
    { 
     var utcNow = DateTime.UtcNow; 
     controller.Refresh(); 
     while (controller.Status != desiredStatus) 
     { 
      if (DateTime.UtcNow - utcNow > timeout) 
      { 
       throw new TimeoutException($"Failed to wait for '{controller.ServiceName}' to change status to '{desiredStatus}'."); 
      } 
      await Task.Delay(250) 
       .ConfigureAwait(false); 
      controller.Refresh(); 
     } 
    } 
} 

Oder mit Unterstützung für eine CancellationToken

public static class ServiceControllerExtensions 
{ 
    public static async Task WaitForStatusAsync(this ServiceController controller, ServiceControllerStatus desiredStatus, TimeSpan timeout, CancellationToken cancellationToken) 
    { 
     var utcNow = DateTime.UtcNow; 
     controller.Refresh(); 
     while (controller.Status != desiredStatus) 
     { 
      if (DateTime.UtcNow - utcNow > timeout) 
      { 
       throw new TimeoutException($"Failed to wait for '{controller.ServiceName}' to change status to '{desiredStatus}'."); 
      } 
      await Task.Delay(250, cancellationToken) 
       .ConfigureAwait(false); 
      controller.Refresh(); 
     } 
    } 
}