2012-03-06 19 views
0

私はWindowsサービスとチュートリアル(これを含む)を多く読んで、以下の目標を達成するための最良の方法を見つけました。しかし、私はいくつかのことを理解することができないので、今私は正しい方法を選択するかどうかと私がした場合、私はそれを実装するかどうかを疑問に思っています。Windowsサービスの通信とスレッド

目的: バックグラウンドで5つの別々のタスクを実行する必要があるため、Windowsサービスを作成します。サービスのほかに、私はサービスに関する情報を表示するフォームアプリケーションが必要です。私が読んだところでは、通信を処理するためにソケットサーバーを使うべきです。

私の計画:ソケットサーバーが正常に起動し、準備ができているとき

  1. Windowsサービス
  2. を作成して非同期ソケット・サーバ・クラスを作成し、
  3. ONSTART方法でそれを開始し、メソッドを呼び出し メインサービスのstartTasks。
  4. executeTaskメソッドを使用して各タスクに個別のクラスを作成します。
  5. startTasksメソッドでは、 がすべて実行可能なので、タスクごとにスレッドを開始します。
  6. タスクは、それが接続されているすべてのクライアントにMSGを送信ソケット・サーバ・クラス でメソッドを呼び出す必要がありますのsendData(MSG)と呼ばれる メインサービス
  7. のsendDataメソッドにメソッドを呼び出す必要があります報告する何かを持っている場合。

問題は3,6,7であり、「他のスレッド/クラスの呼び出しメソッド」に関係しています。私はときに私が別のスレッドからこのサーバを経由してのSendDataすることができますどのよう

  • その 準備asycnサーバがstartTasksメソッドを呼び出すさせることができますどのように

    Simplefiedサービス:

    public partial class SecurityCheck : ServiceBase 
        { 
         private ComServer _comServer; 
         private CheckRequest _checkRequest; 
    
         private readonly Thread[] _threads = new Thread[1]; 
         private int _tNr; 
    
         public SecurityCheck() 
         { 
          InitializeComponent(); 
         } 
    
         protected override void OnStart(string[] args) 
         { 
          _comServer = new ComServer(); 
         } 
    
         protected override void OnStop() 
         { 
          _comServer.CloseSockets(); 
    
          if (_checkRequest != null) 
           _checkRequest.ServiceStarted = false; 
    
          foreach (Thread t in _threads) 
          { 
           if (t != null) 
            t.Join(new TimeSpan(0, 2, 0)); 
          } 
         } 
    
         internal void StartTasks() 
         { 
          _checkRequest = new CheckRequest { ServiceStarted = true }; 
          var st = new ThreadStart(_checkRequest.ExecuteTask); 
          _threads[_tNr] = new Thread(st); 
          _threads[_tNr].Start(); 
          _tNr++; 
         } 
    
         internal void SendData(string msg) 
         { 
          _comServer.SendData(msg); 
         } 
        } 
    

    Simplefiedタスク私は間違いなく(二重)で行くだろうサービスとクライアント間の通信のために

    public class CheckRequest 
    { 
        public bool ServiceStarted; 
    
        public CheckRequest() 
        { 
         //construct me 
        } 
    
        public void ExecuteTask() 
        { 
         while (ServiceStarted) 
         { 
          try 
          { 
           //perform task 
    
           //what to do to send data? 
          } 
          catch (Exception ex) 
          { 
    
          } 
    
          // yield 
          if (ServiceStarted) 
          { 
           Thread.Sleep(new TimeSpan(0, 0, 10)); 
          } 
         } 
    
         Thread.CurrentThread.Abort(); 
        } 
    } 
    
  • 答えて

    0

    代わりにソケットのWCF。これにより、退屈でエラーの多いコーディングが大幅に削減されます。

    第2に、executeTaskメソッドを使用してタスクごとに独立したクラスを持つことは、Javaの世界や実行可能オブジェクトのように聞こえます。 C#では、タスクを別々のメソッドとしてコーディングし、task be executed asynchronouslyとして開始することができます。彼らはクライアントに報告する何かを持っているときに、クライアントとサーバの間の二重チャネルを介して自分自身でsend it to the clientsとすることができます。

    このプロジェクトでWCFとTPLを使用すると、記述したすべての問題をほぼ解決して、夕食に間に合うことができます。これらの新しいテクノロジーを使用するには少し時間がかかるかもしれませんが、転送が簡単でバグの少ないコードを短くすることで、後で時間を節約できます。

    よろしくゲルト・ヤン

    +0

    それを行うにはさらに別の方法をありがとう:)私はそれになりますと、それは私のニーズに合った場合、私は答えとして、それを設定します。 –

    +0

    ハハ、そう、多くの方法:)。私はこれがより ".N​​et 4慣用的な"方法であると感じています。このルートを下ると、ヘルプやチュートリアルなどが見つかる可能性が高くなります。がんばろう! – gjvdkamp

    +0

    私はWCFを見てきましたが、正しく理解すれば、クライアントはサービスからデータを要求する必要があります。しかし、この場合のクライアントは、タスクが何をしているのかをリアルタイムでログに記録します。これは、結合されたタスクからの1秒あたりの複数の更新である可能性があります。私がクライアントにデータを要求させると、実際に送信されたものとされなかったものを追跡し、クライアントでループを使用してデータを取得する必要があります。 doesntは行く最善の方法と思われる。 –

    関連する問題