2015-03-19 165 views
2

當試圖停止服務時,我收到「服務無法在此時接受控制消息」。我不明白爲什麼會發生這種情況。有人可以幫我弄這個嗎?我以爲我的鎖會阻止這一點。C#windows服務無法停止

巡邏方法大約需要30-40秒才能運行。

private static readonly string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"]; 
private static readonly int runMinInterval = Convert.ToInt32(ConfigurationManager.AppSettings["RunMinInterval"]); 
private Object myLock = new Object(); 
private Timer timer; 

public DealWatchdogService() 
{ 
    InitializeComponent(); 
} 

protected override void OnStart(string[] args) 
{ 
    Watchdog.Patrol(ConnectionString, new DealWatchdogService()); 
    timer = new Timer(); 
    timer.Enabled = true; 
    timer.Interval = 60000 * runMinInterval; 
    timer.AutoReset = false; 
    timer.Start(); 
    timer.Elapsed += timer_Elapsed; 
} 

protected override void OnStop() 
{ 
    lock (myLock) 
    { 
     timer.Stop(); 
     timer = null; 
     base.OnStop(); 
    } 
} 

private void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    lock (myLock) 
    { 
     if (timer == null) 
       return; 
     Watchdog.Patrol(tycheConnection, new DealWatchdogService()); 
     timer.Start(); 
    } 
} 

編輯:也許有些幫助,但該服務停止罰款的時候,但是當它已經啓動並運行了一個星期左右,我得到這個錯誤。

+0

如果這是'System.Timers.Timer',則不應同時使用['Enabled'](https://msdn.microsoft.com/en-us/library/system.timers.timer.enabled(v = vs.110).aspx)和'Start':「將Enabled設置爲true與調用Start相同(在配置期望的間隔之前,您可能不應啓用它)。可能不是你目前的問題,但值得銘記。 – 2015-03-19 11:02:57

+0

是的,它是System.Timers.Timer。當然,我會看看那個和改變。 – MrProgram 2015-03-19 11:31:08

+0

你是否在OnStop()以外的任何地方使用'myLock'?如果不是鎖不提供任何好處,一次只有一個線程會調用OnStop() – 2015-03-19 13:24:50

回答

1

巡邏方法需要約30-40秒才能運行。

我認爲問題可能是由於Patrol的長度完成並且設置了一個標誌,表明系統被鎖定,OnStart()時間過長。把你的啓動代碼放到後臺線程上,這樣OnStart可以更快地完成。

protected override void OnStart(string[] args) 
{ 
    //This line does not block. 
    Task.Run(() => RealStart()); 
} 

private void RealStart() 
{ 
    Watchdog.Patrol(ConnectionString, new DealWatchdogService()); 
    timer = new Timer(); 
    //timer.Enabled = true; //Calling .Start() has the same effect. 
    timer.Interval = 60000 * runMinInterval; 
    timer.AutoReset = false; 
    timer.Elapsed += timer_Elapsed; 
    timer.Start(); //Start should be called after you have set .Elapsed 
} 

也可能是唯一的其他東西的東西在裏面timer_Elapsed會錯,但你從來沒有給我們什麼樣的代碼在做什麼。

+0

糾正我,如果我錯了,但不是隻有服務啓動時才調用OnStart?服務啓動正常。但OnStart()阻止呢? – MrProgram 2015-03-19 14:20:41

+0

@krillezzz它是,但我看到服務進入一個奇怪的狀態時,錯誤的內部OnStart()。 – 2015-03-19 14:30:51

+0

好的謝謝。會試試這個 – MrProgram 2015-03-19 15:02:29