2011-05-03 14 views
8

जब आप एक Windows सेवा बनाते हैं, आप सेवाओं आप शुरू करना चाहते की एक सूची बना। डिफ़ॉल्ट यह है:विंडोज सेवा: एक ही सेवा वर्ग के कई उदाहरणों?

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service} 

आप इस तरह एक ही सेवा वर्ग (अलग-अलग पतों या बंदरगाहों के लिए है कि बाँध) के कई उदाहरणों, मिल सकता है?

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service("Option1"), New Service("Option2")} 

या इससे समस्याएं पैदा होंगी? क्या हमें इसके बजाय दो अलग-अलग वर्गों का उपयोग करना चाहिए? इस समस्या का सबसे अच्छा तरीका क्या है?

उत्तर

1

अपने आप में एक सेवा पते या बंदरगाहों के लिए बाध्य नहीं है। आप सेवा को थ्रेड या कार्य शुरू कर सकते हैं, इसलिए एक सेवा उदाहरण सुनने के लिए थ्रेड शुरू कर सकती है। http और अन्य पते: बंदरगाह या जो कुछ भी आप करना चाहते हैं।

निम्न उदाहरण आपको पता चलता है कि मैं क्या मतलब है, यह सी # में है, लेकिन अगर यह आप के लिए अच्छी तरह से अनुवाद नहीं करता है तो this to translate का उपयोग करें। मेरा मुख्य कार्य आपके मामले में आपकी सेवा का प्रारंभ कार्य होगा।

public abstract class ServiceModuleBase 
{ 
    public abstract void Run(); 
} 

public class SomeServiceModule : ServiceModuleBase 
{ 
    //Implement Run for doing some work, binding to addresses, etc. 
} 

public class Program 
{ 

    public static void Main(string[] args) 
    { 

     var modules = new List<ServiceModule> {new SomeServiceModule(), new SomeOtherServiceModule()}; 

     var tasks = from mod in modules 
        select Task.Factory.StartNew(mod.Run, TaskCreationOptions.LongRunning); 

     Task.WaitAll(tasks.ToArray()); 


     Console.Out.WriteLine("All done"); 
     Console.ReadKey(); 


    } 
} 

इसके अलावा, क्यों अपना पहला दृष्टिकोण काम नहीं करता है की here is a nice summary और कैसे चारों ओर है कि

+1

+1 7 क्यू और जवाब पर कोई भी पर upvotes प्राप्त करने के लिए का एक वैकल्पिक तरीका? मुझे यकीन नहीं है कि यह एक अच्छा क्यों है – Basic