2012-06-28 195 views
1

我的windows服務正在OnStart()方法中創建1個線程。線程的代碼包含1個while循環,看起來像這樣:如何停止Windows服務C#?

Thread mworker;  
    AutoResetEvent mStop = new AutoResetEvent(false); 
    protected override void OnStart(string[] args) 
{ 
    // TODO: Add code here to start your service. 

    mworker = new Thread(pwd_fetch); 
    mworker.IsBackground = false; 
    mworker.Start(); 
} 

protected override void OnStop() 
{ 
    // TODO: Add code here to perform any tear-down necessary to stop your service. 
    mStop.Set(); 
    mworker.Join(); 
} 

private void pwd_fetch() 
{ 
    while(true) 
    { 
     //some other code 

     if (mStop.Set()==true) 
      break; 
    } 
} 

我想while循環的條件爲真,但打破我使用IF()指令循環,但仍無法停止服務。

有人知道,爲什麼這樣呢?我怎麼解決這個問題?

+0

3.Stop服務是什麼MSTOP和設置是屬性或方法。如果是方法,則Set在每種情況下都返回false。 –

+0

@Romil:編輯過的代碼。 – sailer

+0

參考瞭解有關Set和WaitOne與AutoresetEvent http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx –

回答

1

要停止該服務,你必須調用ServiceController的實例,並阻止它

ServiceController service = new ServiceController("ServiceName"); 
service .Stop(); 
2

在你的線程循環的方法,你需要使用mStop.WaitOne(帶超時)。調用集將設置句柄......這不是你想要在這裏做的。

if (mStop.WaitOne(500)) 
    break; 
+0

我也嘗試過WaitOne()方法,但服務沒有停止。 – sailer

+0

我建議將視覺工作室調試器附加到您的運行服務。在OnStop()和pwd_fetch()例程中設置斷點以查看發生了什麼。嘗試停止服務,看看哪些斷點和正在發生的事情。這應該做的伎倆。在mStop.Set()指令斷點到達mworker.join()之後的 – pilotcam

+0

。斷點永遠不會進入pwd_fetch() – sailer

0

如果你想停止該服務本身,你可以簡單地調用:

this.Stop() 
0

你必須在服務中添加你的線程代碼開始事件,而不是開始。

+0

並且還使用後臺工作人員,因此您可以取消年進程 – JohnnBlade

0

1.在while循環中始終使用布爾變量而不是「true」 然後,您可以將其設置爲false,以便在需要終止循環內代碼的位置。

2.調用mworker.Abort()來停止線程。通過

new ServiceController("ServiceName").Stop();