1

c# Visual Studio Ultimate で Windows サービスを作成しています。vs は使用するテンプレートを提供しますが、コードをどこに配置すればよいかわかりません。program.cs があります

static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };
        ServiceBase.Run(ServicesToRun);
    }
}

およびservice1.csのサンプルコードは、どのようにフォーマットするかを示していますが、何をしているのかはわかりません。かなり検索しましたが、プログラムを構成する方法が見つかりません

public partial class Service1 : ServiceBase
{
    Thread thread1;

    public Service1()
    {
        InitializeComponent();

        thread1 = new Thread(function);
        thread1.Start();
    }

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }

    public void function()
    {
        while (true)
        {
            //keep doing something
        }
    }
}

ループ関数はどこで呼び出せますか? どこに置いたのか、それともメインから?

4

3 に答える 3

0

function()技術的には、Serviceクラスに入れることに何の問題もありません。その時点で、それはデザインの問題です。たとえばfunction()、クラスの他の操作と似ていることは何ですか? 他のものは、クラスとサービス コントロール マネージャー (SCM) の間の対話に関連しているため、そうではないと思います。

ただし、コードには次の 2 つの問題があります。

  1. コンストラクターではなく OnStart でスレッドを開始します。それがサービスの開始時だからです。
  2. bool フラグなど、関数を停止する何らかの方法を含めます。
于 2012-10-02T13:35:34.677 に答える
0

私の場合は次のようになります。

public partial class Service1 : ServiceBase 
{ 
    Thread thread1; 
   Boolean running = false;

    public Service1() 
    { 
        InitializeComponent(); 

        thread1 = new Thread(function); 

    } 

    protected override void OnStart(string[] args) 
    { 
        thread1.Start(); 
        running = false;
    } 

    protected override void OnStop() 
    { 
        running = false;
        thread1.Stop(); 
    } 

    public void function() 
    { 
        while (running) 
        { 
            //keep doing something 
        } 
    } 
} 
于 2012-10-02T13:34:52.080 に答える
0

のコンストラクターは、Service1SCM を介してサービスが開始されるときだけでなく、エクスプローラーで実行可能なサービスをクリックしても実行されることに注意してください。

そのため、サービス ペイロードを ctor に配置することはお勧めできません。サービスの初期化コードをOnStartメソッドに配置し、ファイナライズ コード (ワーカー スレッドの停止、リソースのクリーンアップなど) をメソッドに配置することをお勧めしOnStopます。

OnStart/OnStopメソッドの実行時間は非常に限られていることに注意してください。
負荷の高い初期化コードを実行する予定がある場合は、可能であれば遅延初期化の使用を検討してください。

また、ThreadPool手動でスレッドを作成する代わりに、/TPL を使用することを検討してください。

于 2012-10-02T13:40:39.753 に答える