नया .NET कोर "जेनेरिक होस्ट" एक कंसोल एप्लिकेशन को लागू करने के लिए एक अच्छा विकल्प की तरह लग रहा था जो कई समवर्ती कार्यों को चलाता है। कार्यों को स्पष्ट रूप से बनाने और चलाने के बजाय, मैंने सोचा कि मैं उन्हें IHostedService (या BackgroundService) का उपयोग करके सेवाओं के रूप में परिभाषित कर सकता हूं। हालांकि, जेनेरिक होस्ट मेरे सभी तथाकथित "पृष्ठभूमि कार्यों" को एक ही थ्रेड पर निष्पादित कर रहा है। क्या यह इरादा व्यवहार है?

public static async Task Main(string[] args)
    {
        var host = new HostBuilder()
        .ConfigureHostConfiguration(...)
        .ConfigureAppConfiguration(...)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddLogging();
            services.AddHostedService<Service1>();
            services.AddHostedService<Service2>();
            services.AddHostedService<Service3>();
        })
        .ConfigureLogging(...)
        .UseConsoleLifetime()
        .Build();

        await host.RunAsync();
    }

जेनेरिक होस्ट मेरी तीनों "पृष्ठभूमि" सेवाओं को एक ही थ्रेड पर चलाता है। Thread.CurrentThread.ManagedThreadId मुख्य थ्रेड पर और प्रत्येक "पृष्ठभूमि" सेवाओं के StartAsync या ExecuteAsync विधियों में 1 के बराबर पाया गया। क्या यह सुनिश्चित करने का कोई तरीका है कि सेवाएं अलग-अलग धागे पर चलती हैं?

5
Jan Hettich 16 अक्टूबर 2018, 03:45

1 उत्तर

सबसे बढ़िया उत्तर

IHostedService इंटरफ़ेस केवल आपको अपना काम शुरू करने और रोकने के लिए हुक देता है। आपकी सेवा जो करती है उसके आधार पर आप स्वयं थ्रेडिंग, पृष्ठभूमि की घटनाओं आदि को लागू करने के लिए जिम्मेदार हैं। आप एक टाइमर सेट कर सकते हैं जो घटनाओं को अतुल्यकालिक रूप से निष्पादित करता है या एक रनिंग बैकग्राउंड थ्रेड आदि सेट करता है।

जेनेरिक होस्ट आपकी "सेवाओं" के लिए थ्रेडिंग या निष्पादन मॉडल नहीं दर्शाता है।

5
Martin Ullrich 16 अक्टूबर 2018, 08:30