私はWindowsサービスとチュートリアル(これを含む)を多く読んで、以下の目標を達成するための最良の方法を見つけました。しかし、私はいくつかのことを理解することができないので、今私は正しい方法を選択するかどうかと私がした場合、私はそれを実装するかどうかを疑問に思っています。Windowsサービスの通信とスレッド
目的: バックグラウンドで5つの別々のタスクを実行する必要があるため、Windowsサービスを作成します。サービスのほかに、私はサービスに関する情報を表示するフォームアプリケーションが必要です。私が読んだところでは、通信を処理するためにソケットサーバーを使うべきです。
私の計画:ソケットサーバーが正常に起動し、準備ができているとき
- Windowsサービス
- を作成して非同期ソケット・サーバ・クラスを作成し、
- ONSTART方法でそれを開始し、メソッドを呼び出し メインサービスのstartTasks。
- executeTaskメソッドを使用して各タスクに個別のクラスを作成します。
- startTasksメソッドでは、 がすべて実行可能なので、タスクごとにスレッドを開始します。
- タスクは、それが接続されているすべてのクライアントにMSGを送信ソケット・サーバ・クラス でメソッドを呼び出す必要がありますのsendData(MSG)と呼ばれる メインサービス
- のsendDataメソッドにメソッドを呼び出す必要があります報告する何かを持っている場合。
問題は3,6,7であり、「他のスレッド/クラスの呼び出しメソッド」に関係しています。私はときに私が別のスレッドからこのサーバを経由してのSendDataすることができますどのよう
- 。
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();
}
}
それを行うにはさらに別の方法をありがとう:)私はそれになりますと、それは私のニーズに合った場合、私は答えとして、それを設定します。 –
ハハ、そう、多くの方法:)。私はこれがより ".Net 4慣用的な"方法であると感じています。このルートを下ると、ヘルプやチュートリアルなどが見つかる可能性が高くなります。がんばろう! – gjvdkamp
私はWCFを見てきましたが、正しく理解すれば、クライアントはサービスからデータを要求する必要があります。しかし、この場合のクライアントは、タスクが何をしているのかをリアルタイムでログに記録します。これは、結合されたタスクからの1秒あたりの複数の更新である可能性があります。私がクライアントにデータを要求させると、実際に送信されたものとされなかったものを追跡し、クライアントでループを使用してデータを取得する必要があります。 doesntは行く最善の方法と思われる。 –