2013-04-12 10 views
5

मैं एक खिड़कियों सेवा है और मैं onStart() घटना के भीतर कार्य चलाने के लिए कोड लिखा है:विंडोज सेवा शुरू होने पर कोई कार्य कैसे चलाया जाए?

protected override void OnStart(string[] args) 
     { 
      this.DoTask(); 
     } 

private void DoTask() 
     { 
      Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()); 

      try 
      { 
       Task.Wait(task1); 
      } 
      catch (Exception ex) 
      { 
       this.Log.Error("Failed running the task", ex); 
      }   
     } 

DoTask एक कभी न खत्म होने पाश है। यह तब बंद हो जाएगा जब सेवा बंद हो जाती है।

Windows could not start the ... service on Local Computer. 
Error 1053: The service did not respond to the start or control request in a timely fashion. 

यह कैसे हल करने के लिए:

लेकिन जब मैं सेवा प्रारंभ करने का प्रयास है, यह एक लंबे समय तो इंतजार कर रहा है मुझे नीचे त्रुटि देता है?

उत्तर

7

आप अपना काम पूरा करने का इंतजार क्यों कर रहे हैं?

मुझे लगता है कि Task.Wait आपके वर्तमान धागे को अवरुद्ध कर रहा है, तो आपको अपनी सेवा शुरू करते समय टाइमआउट मिल रहा है।

संपादित करें: आप इस ब्लॉक को हटाने की जरूरत:

try 
{ 
    Task.Wait(task1); 
} 
catch (Exception ex) 
{ 
    this.Log.Error("Failed running the task", ex); 
} 

Task.Wait वास्तव में अपने वर्तमान धागा ब्लॉक कर रहा है। MSDN के अनुसार:

Task.Wait Method

Waits for the Task to complete execution.

संपादित 2 इस बजाय

Task task1 = Task.Factory.StartNew(() => this.OriginalFileProcessor.StartPolling()).ContinueWith(t => 
{ 
    var aggException = t.Exception.Flatten(); 
    foreach(var ex in aggException.InnerExceptions) 
     this.Log.Error("Failed running the task", ex); 
}, 
TaskContinuationOptions.OnlyOnFaulted); 
+0

प्रतीक्षा इस तरह की प्रतीक्षा नहीं कर रही है। मेरा मतलब है कि यह उस कार्य से किसी भी अपवाद को कैप्चर करेगा। –

+0

प्रतीक्षा * * * "इस तरह प्रतीक्षा कर रहा है"। आपका कोड वहां बैठ गया है, कुछ भी नहीं कर रहा है, उस काम को पूरा करने की प्रतीक्षा कर रहा है। और यह वही थ्रेड पर इंतजार कर रहा है जिसे 'ऑनस्टार्ट' कहा जाता है। –

+0

संख्या। इसका उपयोग अपवाद को पकड़ने के लिए किया जाता है। –

1

लूप में आपको यह जांचने की आवश्यकता है कि सेवा की स्थिति "रोक रही है" और लूप से बाहर निकलें। ओएस आपको मारने का फैसला करने से पहले आपके पास 5 सेकंड हैं।

1

मुझे लगता है कि यह है, क्योंकि आप को समाप्त करने के OriginalFileProcessor.StartPolling() के लिए इंतजार कर रहे हैं क्या है, लेकिन यह कभी नहीं होता है। आपको अपने कार्य उदाहरण को एक अलग सदस्य में ले जाना चाहिए और इसे समाप्त करने की प्रतीक्षा न करें:

private Task m_task = null; 

private void DoTask() 
{ 
    try 
    { 
     m_task = Task.Factory.StartNew(() => this.StartPolling()); 
    } 
    catch 
    { 
     this.Log.Error("Unable to start task", ex); 
     throw; // Rethrow, so that the OS knows, there was something wrong. 
    }   
} 

private void StartPolling() 
{ 
    try 
    { 
     this.OriginalFileProcessor.StartPolling(); 
    } 
    catch (Exception ex) 
    { 
     this.Log.Error("Failed running the task", ex); 
    } 
} 
+0

आपकी पकड़ कभी पकड़ नहीं पाती है। यह केवल तब ही पकड़ सकता है जब आप इसका इंतजार करते हैं। –

+0

@TheLight: इसे केवल 'स्टार्टपॉलिंग' से नहीं, ['Task.Factory.StartNew'] (http://msdn.microsoft.com/en-us/library/dd321439.aspx) से अपवाद प्राप्त करना चाहिए। आप एसिंक को चलाने के लिए एक सेवा शुरू कर रहे हैं, इसे समाप्त होने की प्रतीक्षा न करें। उत्तर अपडेट किया गया। – Carsten

+0

कार्य। फैक्टरी। स्टार्टन्यू अपवाद वापस नहीं करता है। किसी कार्य पर प्रतीक्षा करते समय आप अपवाद को कैप्चर कर सकते हैं। या कोई और तरीका है? –

संबंधित मुद्दे