2013-01-09 49 views
1

問題是,我們沒有辦法在我們嘗試啓動它時嘗試「取消」緩慢/從不啓動的服務,如果時間太長:您是否知道ServiceController類(C#)的任何替代方案

ServiceController ssc = new ServiceController(serviceName); 
ssc.Start(); 
ssc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(ts))); 

讓我們假設我們將'ts'設置爲300秒等待時間太長,等待120後我決定取消操作,我不想等待服務控制器狀態更改或等待發生的時間,我該怎麼做?

回答

2

您可以編寫自己的WaitForStatus函數,該函數接受CancellationToken以獲取取消功能。

public void WaitForStatus(ServiceController sc, ServiceControllerStatus statusToWaitFor, 
    TimeSpan timeout, CancellationToken ct) 
{ 
    var endTime = DateTime.Now + timeout; 
    while(!ct.IsCancellationRequested && DateTime.Now < endTime) 
    { 
     sc.Refresh(); 
     if(sc.Status == statusToWaitFor) 
      return; 

     // may want add a delay here to keep from 
     // pounding the CPU while waiting for status 
    } 

    if(ct.IsCancellationRequested) 
    { /* cancel occurred */ } 
    else 
    { /* timeout occurred */ } 
} 
+0

然而,我有一個問題,您的代碼從上面,IIUC它擴展的ServiceController類,那麼爲什麼通過ServiceController的實例,除非我失去了一些東西,我們不應該引用對象的屬性本身('this')而不是傳遞參考? – safejrz

+0

@safejrz我寫它的方式可以讓你把功能放在任何你想要的地方。你可以從'ServiceController'派生出來 - 在這種情況下,你不需要傳入'ServiceController',也可以通過在ServiceController上使用'this'修飾符來使其成爲擴展方法,或者你可以把它作爲需要代碼的類中的靜態方法。這一切都取決於你,什麼最適合你,你的團隊和你的代碼庫。 –

相關問題