2013-02-19 112 views
1

我有一個Web服務,我需要確保將完成處理,然後在onstop()被調用時退出。目前當onstop()被調用時,服務立即停止。我被告知查看ManualResetEvent和requeststop標誌。我到處找例子甚至發現其中的幾個:使用ManualResetEvent檢查服務是否已完成處理

How do I safely stop a C# .NET thread running in a Windows service?

To make a choice between ManualResetEvent or Thread.Sleep()

http://www.codeproject.com/Articles/19370/Windows-Services-Made-Simple

但我有這麼多的麻煩認識我最能適用於哪一個我情況。下面

代碼:

 System.Timers.Timer timer = new System.Timers.Timer(); 
     private volatile bool _requestStop = false; 
     private static readonly string connStr = ConfigurationManager.ConnectionStrings["bedbankstandssConnectionString"].ConnectionString; 
     private readonly ManualResetEvent _allDoneEvt = new ManualResetEvent(true); 
     public InvService() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      _requestStop = false; 
      timer.Elapsed += timer_Elapsed; 
      double pollingInterval = Convert.ToDouble(ConfigurationManager.AppSettings["PollingInterval"]); 
      timer.Interval = pollingInterval; 
      timer.Enabled = true; 
      timer.Start();  
     } 

     protected override void OnStop() 
     { 
      _requestStop = true; 
      timer.Dispose(); 
     } 

     protected override void OnContinue() 
     { } 

     protected override void OnPause() 
     { } 

     private void timer_Elapsed(object sender, EventArgs e) 
     { 
      if (!_requestStop) 
      { 
       timer.Start(); 
       InvProcessingChanges();  
      }    
     } 

     private void InvProcessingChanges() 
     { 
      //Processes changes to inventory 
     } 

是否有人在經歷了Windows服務還有誰可以幫我? 剛剛完成我的第一個工作服務的Windows服務我很新。此服務需要在實際停止之前完成庫存更新。

回答

3

您使用類似ManualResetEvent的東西等到事件進入信號狀態,然後再完成StopManualResetEventSlim可能更適合考慮您嘗試在同一過程中發出信號。

基本上,您可以在停止期間以及在您處理呼叫Reset時撥打電話Wait,當您完成時,請致電Set

例如

private ManualResetEventSlim resetEvent = new ManualResetEventSlim(false); 

public void InvProcessingChanges() 
{ 
    resetEventSlim.Reset(); 
    try 
    { 
     // TODO: *the* processing 
    } 
    finally 
    { 
     resetEvent.Set(); 
    } 
} 

public void WaitUntilProcessingComplete() 
{ 
    resetEvent.Wait(); 
} 

,並根據您的服務:

protected override void OnStop() 
    { 
     WaitUntilProcessingComplete(); 
    } 
+0

只是一個問題@peter是你WebServiceProcessMethod我invprocessingchanges? – user1270384 2013-02-19 20:49:55

+0

@ user1270384是的,我編輯了答案來反映這一點。 – 2013-02-19 22:01:26

+0

請注意我的Onstop如何具有以下代碼protected override void OnStop() { _requestStop = true; timer.Dispose(); }它現在改變了還是你的代碼被包含在這? – user1270384 2013-02-19 22:26:44

相關問題