2016-01-19 230 views
2

我已經在Visual Studio社區2015年在我的Windows 10的筆記本電腦中創建一個Windows服務項目(從Windows 7升級,全面更新),但我一直無法人工成功啓動我的服務,一旦服務開始啓動,我無法強制終止服務。當我嘗試啓動通過服務控制檯(Services.msc)中我的服務,我得到了以下行爲:無法手動啓動C#Windows服務

  1. A「服務控制」對話框會彈出一個進度條。
  2. 進度條在90秒內緩慢填充。
  3. 當進度條已滿時,我收到錯誤1053.
  4. 服務的狀態更改爲並且在「開始」(開始待定)時保持無限。
  5. 除了強制重啓之外,服務不能以任何方式停止。

我已經明白,錯誤1053是30秒後無法啓動的服務的結果。但是,我的服務不可能花費超過30秒的時間啓動。我OnStartOnStopOnTimer方法目前如下:

protected override void OnStart(string[] args) 
{ 
    System.Timers.Timer timer = new System.Timers.Timer(); 
    timer.Interval = 10000; 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer); 
    timer.Start(); 
} 

protected override void OnStop() 
{ 
} 

public void OnTimer(object sender, System.Timers.ElapsedEventArgs args) 
{ 
} 

而且我Main方法是這樣的:

static void Main() 
{ 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] 
    { 
     new MyNewService() 
    }; 
    ServiceBase.Run(ServicesToRun); 
} 

奇怪的是,如果我的服務的啓動方式設置爲「自動」,則服務確實會在下一次Windows重新啓動時自行啓動。當它自動啓動時,我可以手動停止服務(這是唯一一次手動停止)。但是,手動成功停止後,我仍然無法手動重新啓動它。嘗試這樣做產生完全相同的行爲沒有錯誤(通過installutil)前文所述,在錯誤再次導致1053

我的服務安裝,並沒有錯誤,我可以卸載。但是,如果嘗試在服務停留在「正在啓動」(啓動待定)模式時嘗試卸載我的服務(通過installutil/u),服務不會停止,仍然爲「正在啓動」,並且啓動模式將切換爲「已禁用」。只有在重新啓動後才能完全刪除服務。

我的問題: 爲什麼我的服務在Windows啓動時自動啓動,但不能通過任何其他手動方法啓動? (我需要它自動啓動,但也可以手動啓動和停止它。)

謝謝您的時間和專業知識。

+0

顯示OnStop方法 – BWA

+0

OnStop方法添加到原始文章,它是空的 – Chase

+0

你可以檢查事件查看器,看看是否有任何錯誤被捕獲? – Martin

回答

2

問題是Avast反病毒靜靜地停止服務。令人煩惱的是,Avast不會將該服務報告爲病毒或任何類型的威脅,也不會記錄被阻止的服務。一旦我禁用了Avast,我就能夠成功啓動和停止我的服務。作爲半永久性解決方案,我通過轉到設置 - >主動保護 - >自定義(文件系統防護) - >排除,然後單擊「添加」,將我的服務路徑添加到Avast的例外列表中。「

爲了回答我原來的問題,我的服務能夠在Windows啓動時自動啓動,因爲它能夠在Avast加載之前啓動,這導致了我觀察到的奇怪行爲,在它之後我能夠阻止它自動啓動,但沒有手動重新啓動,因爲Avast現在正在運行該點

1

你應該在方法OnStop中清理服務。 您創建一個timer並永不停止。

private System.Timers.Timer timer; 

protected override void OnStart(string[] args) 
{ 
    timer = new System.Timers.Timer(); 
    timer.Interval = 10000; 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer); 
    timer.Start(); 
} 

protected override void OnStop() 
{ 
    timer.Stop(); 
    timer = null; 
} 
+0

已經嘗試過,但它對行爲沒有影響。 – Chase

+0

@Chase然後顯示'OnTimer'方法,也許在這裏是錯誤的。 – BWA

+0

OnTimer也是空的。將添加到原始帖子。 – Chase