উইন্ডোজ পরিষেবা হিসাবে নেট কনসোল অ্যাপ্লিকেশন


145

আমার কনসোল অ্যাপ্লিকেশন রয়েছে এবং এটি উইন্ডোজ পরিষেবা হিসাবে চালাতে চাই। ভিএস 2010 এর প্রকল্প টেমপ্লেট রয়েছে যা কনসোল প্রকল্প সংযুক্ত করতে এবং উইন্ডোজ পরিষেবা তৈরি করতে দেয়। আমি পৃথক পরিষেবা প্রকল্প যুক্ত করতে চাই না এবং যদি সম্ভব হয় তবে কনসোল অ্যাপ্লিকেশন হিসাবে কনসোল অ্যাপ্লিকেশন হিসাবে কনসোল অ্যাপ্লিকেশন হিসাবে কনসোল অ্যাপ্লিকেশন রাখতে পারে যা কনসোল অ্যাপ্লিকেশন হিসাবে বা উইন্ডোজ পরিষেবা হিসাবে চলতে পারে যদি উদাহরণস্বরূপ সুইচ ব্যবহার করে চালানো যায় তবে সার্ভিস কোডটি সংহত করতে হবে।

হতে পারে কেউ ক্লাস লাইব্রেরি বা কোড স্নিপেটের পরামর্শ দিতে পারে যা দ্রুত এবং সহজেই সি # কনসোল অ্যাপ্লিকেশনটিকে পরিষেবাতে রূপান্তর করতে পারে?


আপনি কেন কেবল একটি অস্থায়ী পরিষেবা প্রকল্প তৈরি করেন না এবং বিটগুলি যে এটি পরিষেবা করে তা অনুলিপি করেন?
গাবে

4
আপনি চেষ্টা করতে পারেন টপশেল্ফ টপসেল্ফ
আর্টেম

আপনি এখানে বর্ণিত কৌশলটি চেষ্টা করতে পারেন: einaregilsson.com/2007/08/15/…
জো

তাই না? আমি নিশ্চিত নই. এই সম্পর্কে.

2
একটি খুব সহজ শীর্ষ শেল্ফ বিকল্প: runasservice.com
লুইস পেরেজ

উত্তর:


185

কনসোল অ্যাপ্লিকেশন বা পরিষেবা হিসাবে একই অ্যাপ্লিকেশনটি চালানোর জন্য আমি সাধারণত নিম্নলিখিত টেকিনেক ব্যবহার করি:

public static class Program
{
    #region Nested classes to support running as service
    public const string ServiceName = "MyService";

    public class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = Program.ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }
    #endregion

    static void Main(string[] args)
    {
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        {
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        }
    }

    private static void Start(string[] args)
    {
        // onstart code here
    }

    private static void Stop()
    {
        // onstop code here
    }
}

Environment.UserInteractiveকনসোল অ্যাপ্লিকেশনটির জন্য সাধারণত সত্য এবং কোনও পরিষেবার জন্য মিথ্যা। প্রযুক্তিগতভাবে, ব্যবহারকারীর-ইন্টারেক্টিভ মোডে কোনও পরিষেবা চালানো সম্ভব, সুতরাং আপনি পরিবর্তে একটি কমান্ড-লাইন সুইচ পরীক্ষা করতে পারেন।


3
আপনি সার্ভিস ইনস্টলারের ক্লাস ব্যবহার করেন, দেখুন msdn.microsoft.com/en-us/library/…
ভ্লাদভ

2
এটি প্রত্যাশিত - আপনার পরিষেবাটি পৃথক প্রক্রিয়া হিসাবে চলবে (সুতরাং এটি টাস্ক ম্যানেজারে প্রদর্শিত হবে) তবে এই প্রক্রিয়াটি সিস্টেম দ্বারা নিয়ন্ত্রিত হবে (উদাঃ সার্ভিস সেটিংস অনুসারে শুরু, থামানো, পুনঃসূচনা)।
ভ্লাদভি

2
আপনি যদি এটি কনসোল অ্যাপ্লিকেশন হিসাবে চালনা করেন তবে আপনি কোনও পরিষেবা দেখতে পাবেন না। এই কোডটির পুরো উদ্দেশ্য হ'ল এটি আপনাকে কনসোল অ্যাপ্লিকেশন হিসাবে অথবা কোনও পরিষেবা হিসাবে চালাতে সক্ষম করে। পরিষেবা হিসাবে চালনার জন্য আপনাকে প্রথমে এটি ইনস্টল করতে হবে (সার্ভিস ইনস্টলারের ক্লাসটি ব্যবহার করে - উপরে এমএসডিএন লিঙ্কটি দেখুন - বা ইনস্টলটুইল.এক্সই) এবং নিয়ন্ত্রণ প্যানেল থেকে পরিষেবাটি চালানো উচিত।
ভ্লাদভি

2
সার্ভিস ইনস্টললার উইন্ডোজ পরিষেবাদিগুলির সাথে ডিল করার জন্য কেবল একটি ইউটিলিটি ক্লাস (ইনস্টলটুইল.এক্সি বা স্ক.এক্সই ইউটিলিটিগুলির মতো কিছুটা)। আপনি পরিষেবা হিসাবে যা চান তা ইনস্টল করতে এটি ব্যবহার করতে পারেন, ওএস আপনার যে প্রজেক্টের প্রকারটি ব্যবহার করে সেটির কোনও যত্ন করে না।
ভ্লাদভি

5
আপনার প্রকল্পে কেবল সিস্টেমের মধ্যে একটি উল্লেখ যুক্ত করুন add সার্ভিসপ্রসেস এবং আপনি উপরের কোডটি ব্যবহার করতে সক্ষম হবেন
ড্যানিমাল

59

আমি টপশেল্ফের সাথে দুর্দান্ত সাফল্য পেয়েছি

টপশেল্ফ একটি ন্যুগেট প্যাকেজ যা এনটাইটেল উইন্ডোজ অ্যাপ্লিকেশনগুলি কনসোল অ্যাপস বা উইন্ডোজ পরিষেবাদি হিসাবে চলতে পারে create আপনি দ্রুত আপনার ইভেন্ট শুরু এবং বন্ধের মতো ইভেন্টগুলি হুক আপ করতে পারেন, কোড ব্যবহার করে কনফিগার করুন যেমন অ্যাকাউন্টটি এটি চালিত হয় সেটিকে সেট করতে, অন্যান্য পরিষেবায় নির্ভরতা কনফিগার করতে এবং এটি ত্রুটি থেকে কীভাবে পুনরুদ্ধার করে তা কনফিগার করতে পারেন।

প্যাকেজ ম্যানেজার কনসোল থেকে (নুগেট):

ইনস্টল-প্যাকেজ টপশেল্ফ

পড়ুন কোড নমুনার দেখায়।

উদাহরণ:

HostFactory.Run(x =>                                 
{
    x.Service<TownCrier>(s =>                        
    {
       s.ConstructUsing(name=> new TownCrier());     
       s.WhenStarted(tc => tc.Start());              
       s.WhenStopped(tc => tc.Stop());               
    });
    x.RunAsLocalSystem();                            

    x.SetDescription("Sample Topshelf Host");        
    x.SetDisplayName("Stuff");                       
    x.SetServiceName("stuff");                       
}); 

টপশেল্ফ পরিষেবা ইনস্টলেশনটিরও যত্ন নেয়, যা অনেক সময় সাশ্রয় করতে পারে এবং আপনার সমাধান থেকে বয়লারপ্লেট কোডটি সরিয়ে দেয়। আপনার .exe কে পরিষেবা হিসাবে ইনস্টল করতে আপনি কেবল কমান্ড প্রম্পট থেকে নিম্নলিখিতটি সম্পাদন করুন:

myservice.exe install -servicename "MyService" -displayname "My Service" -description "This is my service."

আপনার কোনও সার্ভিস ইনস্টলারের হুক করার দরকার নেই এবং টপশেল্ফ এটি আপনার পক্ষে করে।


1
হাই, আমি এটি পাচ্ছি: - "'টপসেল্ফ ৪.০.১' প্যাকেজটি ইনস্টল করতে পারিনি You আপনি এই প্যাকেজটি এমন একটি প্রকল্পে ইনস্টল করার চেষ্টা করছেন যা লক্ষ্য করে '। নেট ফ্রেমওয়ার্ক, সংস্করণ = v4.5', কিন্তু প্যাকেজটিতে কোনওটি নেই সমাবেশ রেফারেন্স বা বিষয়বস্তু ফাইল যা সেই কাঠামোর সাথে সামঞ্জস্যপূর্ণ " এখানে কি ভুল?

3
নিশ্চিত হয়ে নিন যে আপনি ক্লায়েন্ট প্রোফাইল নয়, সম্পূর্ণ .NET 4.5.2 রানটাইমটিকে টার্গেট করছেন।
সেল

দয়া করে আপনি myservice.exe সম্পর্কে আরও আলোকপাত করতে পারেন এবং কোন ডিরেক্টরি থেকে আপনি কমান্ড প্রম্পটটি খুলতে
চলেছেন

1
@ আইজুগবালা মাইসারওয়াইস.এক্সই কোডস স্যাম্পলটিতে প্রদর্শিত টপসেল্ফ বুটস্ট্র্যাপ করে আপনার তৈরি করা কনসোল অ্যাপ্লিকেশন।
সেল

Myservice.exe কোনও পরিষেবা হিসাবে ইনস্টল হওয়ার পরে কনসোল হিসাবে চালানো যেতে পারে ?. ডকুমেন্টেশন পরিষ্কার নয়: "একবার কনসোল অ্যাপ্লিকেশন তৈরি হয়ে গেলে, বিকাশকারী একটি একক পরিষেবা শ্রেণি তৈরি করেন" ডকস.টপসেল্ফ- প্রকল্প
মাইকেল ফ্রেইজিম

27

সুতরাং এখানে সম্পূর্ণ ওয়াকথ্রু:

  1. নতুন কনসোল অ্যাপ্লিকেশন প্রকল্প তৈরি করুন (যেমন মাই সার্ভিস)
  2. দুটি লাইব্রেরি রেফারেন্স যুক্ত করুন: System.ServiceProcess এবং System.Configration.Install
  3. নীচে মুদ্রিত তিনটি ফাইল যুক্ত করুন
  4. প্রকল্পটি তৈরি করুন এবং "ইনস্টলটুইট.এক্সি সি: \ পাথ \ থেকে \ মাই সার্ভিস.এক্সে" চালান
  5. এখন আপনার সার্ভিস তালিকায় মাই সার্ভিসেসটি দেখতে হবে (চালিত Services.msc)

* ইনস্টলটল.এক্স.সি সাধারণত এখানে পাওয়া যায়: সি: \ উইন্ডোজ \ মাইক্রোসফট. নেট \ ফ্রেমওয়ার্ক \ v4.0.30319 \ ইনস্টলটল.এক্স.এ

Program.cs

using System;
using System.IO;
using System.ServiceProcess;

namespace MyService
{
    class Program
    {
        public const string ServiceName = "MyService";

        static void Main(string[] args)
        {
            if (Environment.UserInteractive)
            {
                // running as console app
                Start(args);

                Console.WriteLine("Press any key to stop...");
                Console.ReadKey(true);

                Stop();
            }
            else
            {
                // running as service
                using (var service = new Service())
                {
                    ServiceBase.Run(service);
                }
            }
        }

        public static void Start(string[] args)
        {
            File.AppendAllText(@"c:\temp\MyService.txt", String.Format("{0} started{1}", DateTime.Now, Environment.NewLine));
        }

        public static void Stop()
        {
            File.AppendAllText(@"c:\temp\MyService.txt", String.Format("{0} stopped{1}", DateTime.Now, Environment.NewLine));
        }
    }
}

MyService.cs

using System.ServiceProcess;

namespace MyService
{
    class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = Program.ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }
}

MyServiceInstaller.cs

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace MyService
{
    [RunInstaller(true)]
    public class MyServiceInstaller : Installer
    {
        public MyServiceInstaller()
        {
            var spi = new ServiceProcessInstaller();
            var si = new ServiceInstaller();

            spi.Account = ServiceAccount.LocalSystem;
            spi.Username = null;
            spi.Password = null;

            si.DisplayName = Program.ServiceName;
            si.ServiceName = Program.ServiceName;
            si.StartType = ServiceStartMode.Automatic;

            Installers.Add(spi);
            Installers.Add(si);
        }
    }
}

1
আপনি যদি project৪ বিটের জন্য আপনার প্রকল্পটি সংকলন করে থাকেন তবে আপনাকে ইনস্টলটল.এক্সি ব্যবহার করতে হবে 64৪ বিটের জন্য যা এখানে পাওয়া যাবে: সি: \ উইন্ডোজ \ মাইক্রোসফট.নেট \ ফ্রেমওয়ার্ক \ \ ... ৩২ বিটের সংস্করণ (সি: \ উইন্ডোজ) \ মাইক্রোসফট.নেট \ ফ্রেমওয়ার্ক) আপনাকে একটি খারাপ চিত্রের ফর্ম্যাট এক্সেক্সশন ছুড়ে দেবে ...
স্নেটিক

এটি খুব ভালভাবে কাজ করে, নোট করুন যে @ স্নেটিক বলেছেন যে আপনি যদি বেস 64 ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনি সঠিক ডিরেক্টরিটি ব্যবহার করছেন। এছাড়াও, আপনি যদি আমার মতো একই কাজটি করেন এবং পরিষেবাটি "মাই সার্ভিস" ব্যতীত অন্য কিছুতে নামকরণ করতে ভুলে যান তবে কোডটিতে পরিবর্তন করার আগে আপনি পরিষেবাটি আনইনস্টল করার বিষয়টি নিশ্চিত করুন।
dmoore1181

3

আমি আপনার বক্তব্যটি পুনরায় কোডগুলি বন্ধ করার জন্য একটি অ্যাসেম্বলি চায় বলে শুনেছি তবে, এটি সহজ হবে এবং কোড পুনরাবৃত্তি হ্রাস করবে এবং ভবিষ্যতে আপনার কোডটি অন্য উপায়ে পুনরায় ব্যবহার করা আরও সহজ করে তুলবে ...... আপনি যদি এটি 3 টি অ্যাসেমব্লিতে বিভক্ত করেন তবে।

  1. একটি গ্রন্থাগার সমাবেশ যা সমস্ত কাজ করে। তারপরে দুটি খুব খুব সরু / সরল প্রকল্প রয়েছে:
  2. কমান্ডলাইন যা এক
  3. একটি যা উইন্ডোজ পরিষেবা।

1
এভাবেই আমি বছর জন্য এটি সম্পন্ন করেছি - পরিষেবার প্রায় কাছাকাছি রয়েছে Start()এবং Stop()পদ্ধতি ও কনসোল অ্যাপ্লিকেশন একটি লুপ আছে। টপসেল্ফের মতো কাঠামো ব্যবহারের সংক্ষিপ্ততা, এটি সেরা বিকল্প
বেসিক

সর্বাধিক উত্তর সঙ্গে একমত। সহজ সমাধানের জন্য 3 ডি পার্টি সরঞ্জাম ব্যবহার করা ভবিষ্যতের
মূল বিষয়টিকে

3

সর্বশেষতম। নেট কোর ৩.১ এর উপর ভিত্তি করে ওয়ার্কার সার্ভিস হিসাবে কনসোল অ্যাপ্লিকেশনটিকে উইন্ডোজ পরিষেবাতে কীভাবে পরিবর্তন করা যায় তার একটি নতুন উপায় এখানে is

আপনি যদি ভিজ্যুয়াল স্টুডিও 2019 থেকে একটি ওয়ার্কার পরিষেবা তৈরি করেন এটি আপনাকে বাক্সের বাইরে উইন্ডোজ পরিষেবা তৈরি করার জন্য আপনার প্রয়োজনীয় সমস্ত কিছু দেবে, এটি একটি উইন্ডোজ পরিষেবাতে রূপান্তর করার জন্য কনসোল অ্যাপ্লিকেশনটিতে আপনাকে পরিবর্তন করতে হবে।

এখানে আপনার পরিবর্তনগুলি করা দরকার:

নিম্নলিখিত NuGet প্যাকেজ ইনস্টল করুন

Install-Package Microsoft.Extensions.Hosting.WindowsServices -Version 3.1.0
Install-Package Microsoft.Extensions.Configuration.Abstractions -Version 3.1.0

প্রোগ্রামের পরিবর্তনগুলি নীচের মত একটি বাস্তবায়ন পেতে:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace ConsoleApp
{
    class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).UseWindowsService().Build().Run();
        }

        private static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
    }
}

এবং Worker.cs যুক্ত করুন যেখানে আপনি পরিষেবাটি চালাবেন এমন কোডটি পরিষেবাটিতে রাখবেন:

using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp
{
    public class Worker : BackgroundService
    {
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            //do some operation
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            return base.StartAsync(cancellationToken);
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            return base.StopAsync(cancellationToken);
        }
    }
}

যখন সবকিছু প্রস্তুত হয়ে যায় এবং অ্যাপ্লিকেশনটি সফলভাবে নির্মিত হয়, আপনি নিম্নলিখিত কমান্ডটি সহ উইন্ডোজ পরিষেবা হিসাবে আপনার কনসোল অ্যাপ্লিকেশনটি ইনস্টল করতে sc.exe ব্যবহার করতে পারেন :

sc.exe create DemoService binpath= "path/to/your/file.exe"

2

তুমি ব্যবহার করতে পার

reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v ServiceName /d "c:\path\to\service\file\exe"

এবং এটি পরিসেবা তালিকায় উপস্থিত হবে। আমি জানি না, যদিও এটি সঠিকভাবে কাজ করে। একটি পরিষেবা সাধারণত বেশ কয়েকটি ইভেন্ট শুনতে হয়।

বেশ কয়েকটি পরিষেবা র‌্যাপার রয়েছে যদিও এটি কোনও বাস্তব অ্যাপ্লিকেশন হিসাবে কোনও অ্যাপ্লিকেশন চালাতে পারে। উইন 20033 রিসোর্স কিট থেকে উদাহরণস্বরূপ মাইক্রোসফ্টস এসআরভিএনি


আপনি যেমনটি বলেছেন, সার্ভিস এক্সিকে উইন্ডোগুলির সাথে যোগাযোগের প্রয়োজন হবে। SrvAny লিঙ্ক জন্য +1
Jodrell

5
আমি এই পদ্ধতিকে অনিরাপদ বিবেচনা করব। পরিষেবাদি পরিচালনার জন্য উইন্ডোজের বিশেষ গ্রন্থাগার এবং ইউটিলিটি রয়েছে এবং তারা বিভিন্ন ওএস সংস্করণ এবং পরিবেশে ধারাবাহিকভাবে কাজ করার সম্ভাবনা বেশি। .NET অ্যাপ্লিকেশনটির জন্য ভিএস-তে একটি এমএসআই ইনস্টলার তৈরি করা বেশ সহজ is ম্যানেজডইনস্টলারক্লাস.ইনস্টলহেল্পার পদ্ধতিটি ব্যবহার করে ইনস্টাগ্রামালিকভাবে ইনস্টলেশন সম্পাদন করাও সম্ভব ble
ভ্লাদভি

1
ইনস্টলার এবং স্টাফের প্রয়োজন নেই: কেবল এই কমান্ড লাইনটি ব্যবহার করুন: মাই সার্ভিসনাম বিনপথ তৈরি করুন = "সি: \ পথ \ থেকে \ পরিষেবা \ ফাইল \ উদাহরণ"
জেডিসি

2

প্রথমত আমি কনসোল অ্যাপ্লিকেশন সমাধানটি উইন্ডোজ পরিষেবা সমাধানটিতে এম্বেড করে রেফারেন্স করি।

তারপরে আমি কনসোল অ্যাপ্লিকেশন প্রোগ্রামের ক্লাসটি সর্বজনীন করি

/// <summary>
/// Hybrid service/console application
/// </summary>
public class Program
{
}

আমি কনসোল অ্যাপ্লিকেশন মধ্যে দুটি ফাংশন তৈরি

    /// <summary>
    /// Used to start as a service
    /// </summary>
    public void Start()
    {
        Main();
    }

    /// <summary>
    /// Used to stop the service
    /// </summary>
    public void Stop()
    {
       if (Application.MessageLoop)
            Application.Exit();   //windows app
        else
            Environment.Exit(1);  //console app
    }

তারপরে উইন্ডোজ পরিষেবাটিতে নিজেই আমি প্রোগ্রামটি ইনস্ট্যান্ট করি এবং স্টার্ট এবং স্টপ ফাংশনগুলিকে অনস্টার্ট এবং অনস্টপের মধ্যে যুক্ত করব। নিচে দেখ

class WinService : ServiceBase
{
    readonly Program _application = new Program();

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        ServiceBase[] servicesToRun = { new WinService() };
        Run(servicesToRun);
    }

    /// <summary>
    /// Set things in motion so your service can do its work.
    /// </summary>
    protected override void OnStart(string[] args)
    {
        Thread thread = new Thread(() => _application.Start());
        thread.Start();
    }

    /// <summary>
    /// Stop this service.
    /// </summary>
    protected override void OnStop()
    {
        Thread thread = new Thread(() => _application.Stop());
        thread.Start();
    }
}

এই পদ্ধতির একটি উইন্ডোজ অ্যাপ্লিকেশন / উইন্ডোজ পরিষেবা সংকর জন্য ব্যবহার করা যেতে পারে


এই মূলত JonAlb পূর্ববর্তী উত্তরে বলেছি, কিন্তু কোড উদাহরণস্বরূপ ধন্যবাদ
tatigo

0

আপনার প্রয়োজন অনুসারে আপনার সংজ্ঞা দেওয়া উচিত, যতদূর আমি জানি, আপনি একই সাথে আপনার অ্যাপ্লিকেশনটি কনসোল বা পরিষেবা হিসাবে চালাতে পারবেন না command মনে রাখবেন যে পরিষেবাটি ইনস্টল করা আছে এবং আপনাকে সার্ভিস ম্যানেজারে এটি শুরু করতে হবে, আপনি একটি নতুন অ্যাপ্লিকেশন তৈরি করতে পারেন যা পরিষেবাটি শুরু করে বা আপনার কনসোল অ্যাপ্লিকেশনটি চালিয়ে একটি নতুন প্রক্রিয়া শুরু করে। কিন্তু আপনি যেমন লিখেছেন

"কনসোল অ্যাপ্লিকেশনটিকে একটি প্রকল্প হিসাবে রাখুন"

একবার, আমি আপনার অবস্থানে ছিলাম, একটি কনসোল অ্যাপ্লিকেশনটিকে পরিষেবাতে পরিণত করেছিলাম। আপনি ভিএস এক্সপ্রেস সংস্করণে কাজ করছেন এমন ক্ষেত্রে প্রথমে আপনার টেমপ্লেটের প্রয়োজন। এখানে একটি লিঙ্ক রয়েছে যেখানে আপনি আপনার প্রথম পদক্ষেপ নিতে পারেন: সি # উইন্ডোজ পরিষেবা , এটি আমার জন্য খুব সহায়ক ছিল। তারপরে সেই টেমপ্লেটটি ব্যবহার করে পরিষেবার কোডের পছন্দসই ইভেন্টগুলিতে আপনার কোড যুক্ত করুন।

আপনার পরিষেবাটি উন্নত করার জন্য, আপনি আরও একটি কাজ করতে পারেন তবে এটি দ্রুত এবং / বা সহজে নয়, অ্যাপডোমেনগুলি ব্যবহার করছে এবং লোড / আনলোড করার জন্য dlls তৈরি করছে। একটিতে আপনি কনসোল অ্যাপ্লিকেশন দিয়ে একটি নতুন প্রক্রিয়া শুরু করতে পারেন এবং অন্য একটি ডেলিতে আপনি কেবল পরিষেবাটি যে কার্যকারিতা করতে পারেন তা রাখতে পারেন।

শুভকামনা।


0

আপনার কার্যকারিতাটি কোনও শ্রেণি বা ক্লাসে আলাদা করতে হবে এবং দুটি স্টাবের মধ্যে একটির মাধ্যমে এটি চালু করতে হবে। কনসোল স্টাব বা পরিষেবা স্টাব।

এটি দেখতে প্লেস হিসাবে, উইন্ডোজ চলাকালীন, অবকাঠামো তৈরি করে এমন অগণিত পরিষেবাগুলি ব্যবহারকারীর কাছে কনসোল উইন্ডোজ উপস্থাপন করে না (এবং সরাসরি করতে পারে না)। পরিষেবাটি গ্রাহকহীন উপায়ে ব্যবহারকারীর সাথে যোগাযোগ করতে হবে: এসসিএমের মাধ্যমে; ইভেন্ট লগ, কিছু লগ ফাইল ইত্যাদি। পরিষেবাটি এসসিএম এর মাধ্যমে উইন্ডোগুলির সাথে যোগাযোগের প্রয়োজন হবে, অন্যথায় এটি শাটডাউন পাবে।

এটি অবশ্যই স্পষ্টভাবে গ্রহণযোগ্য হবে যে কোনও কনসোল অ্যাপ্লিকেশন যা পরিষেবার সাথে যোগাযোগ করতে পারে তবে জিইউআই ইন্টারেক্টের প্রয়োজন ছাড়াই পরিষেবাটি স্বতন্ত্রভাবে চালানো দরকার।

কনসোল স্টাবটি পরিষেবা আচরণের জন্য ডিবাগ করার জন্য খুব দরকারী তবে "উত্পাদনশীল" পরিবেশে ব্যবহার করা উচিত নয় যা সর্বোপরি পরিষেবা তৈরির উদ্দেশ্য the

আমি এটি সম্পূর্ণরূপে পড়িনি তবে এই নিবন্ধটি সঠিক দিকটিতে পিন্ট করছে বলে মনে হচ্ছে।


0

আমি একটি পরিষেবা শ্রেণি ব্যবহার করি যা দ্বারা নির্ধারিত স্ট্যান্ডার্ড প্যাটার্ন অনুসরণ করে ServiceBase এবং সহায়তাকারীদের এফ 5 ডিবাগিংয়ের জন্য ব্যবহার করে। এটি সেবার মধ্যে পরিষেবা ডেটা সংজ্ঞায়িত রাখে, তাদের সন্ধান করা সহজ করে তোলে এবং তাদের জীবনকালকে পরিচালনা করা সহজ করে তোলে।

আমি সাধারণত নীচের কাঠামোগুলি সহ একটি উইন্ডোজ অ্যাপ্লিকেশন তৈরি করি। আমি কোন কনসোল অ্যাপ্লিকেশন তৈরি করি না; এই ভাবে আমি অ্যাপটি চালানোর সময় কোনও বড় ব্ল্যাক বক্স আমার মুখে পপ করে ফেলব না। আমি ডিবাগারে থাকি যেখানে সমস্ত ক্রিয়া আছে। আমি ব্যবহার করিDebug.WriteLine যাতে বার্তাগুলি আউটপুট উইন্ডোতে যায়, যা অ্যাপটি সমাপ্ত হওয়ার পরে খুব সুন্দরভাবে ডক করে এবং দৃশ্যমান থাকে।

আমি সাধারণত থামার জন্য ডিবাগ কোড যুক্ত বিরক্ত করি না; পরিবর্তে আমি কেবল ডিবাগারটি ব্যবহার করি। আমার যদি ডিবাগ থামানো দরকার, আমি প্রকল্পটি একটি কনসোল অ্যাপ্লিকেশন করব, একটি Stopফরোয়ার্ডার পদ্ধতি যুক্ত করব এবং কল করার পরে এটিকে কল করবConsole.ReadKey

public class Service : ServiceBase
{
    protected override void OnStart(string[] args)
    {
        // Start logic here.
    }

    protected override void OnStop()
    {
        // Stop logic here.
    }

    static void Main(string[] args)
    {
        using (var service = new Service()) {
            if (Environment.UserInteractive) {
                service.Start();
                Thread.Sleep(Timeout.Infinite);
            } else
                Run(service);
        }
    }
    public void Start() => OnStart(null);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.