3

整数のキューを維持し、WCF呼び出しを介して他のアプリケーションから新しい整数を受け入れる単純なWindowsサービスを作成しようとしています。私の現在の実装は、それと通信するアプリケーションごとに別々のキューを維持しているようですが、これは私が望んでいることではありません。

マイクロソフトの「方法:マネージドWindowsサービスでWCFサービスをホストする」の指示に従うことから始めました。

私のWindowsServiceクラスは次のようになります。

public class MyWindowsService : ServiceBase{
    public ServiceHost serviceHost = null;

    public MyWindowsService(){
        ServiceName = "AdHocReportService";
    }
    public static void Main(){
        ServiceBase.Run(new MyWindowsService());
    }

    protected override void OnStart(string[] args){
        if (serviceHost != null)
            serviceHost.Close();

        serviceHost = new ServiceHost(typeof(MyService));
        serviceHost.Open();
    }
    protected override void OnStop(){
        if (serviceHost != null){
            serviceHost.Close();
            serviceHost = null;
        }
    }
}

私のServiceクラスには、キューとAddメソッドがあります。addメソッドは、追加後にキュー内のアイテムの数を返します。コードは次のようになります。

public class MyService : IMyService
{
    private Queue<int> myQueue= new Queue<int>();

    public int Add(int reportId)
    {
        myQueue.Enqueue(reportId);
        return myQueue.Count;
    }
}

最後に、ConsoleAppで次のコードを使用してサービスをテストします。

MyServiceClient client = new MyServiceClient();
int count = client.Add(10);
Console.WriteLine(count);  //prints 1
count = client.Add(25);
Console.WriteLine(count);  //prints 2
Console.ReadLine();

これにより、最初にテストを実行したときに1と2が出力され、次に3と4が出力され、3番目に5と6が出力されると予想されます。ただし、コンソールアプリがオブジェクト自体をインスタンス化し、Windowsサービス内のオブジェクトを操作していないかのように、毎回1と2を返すだけです。何がわからないの?

4

1 に答える 1

5

singletonWCF サービスが必要だと思います。ここを参照してください。

既定では、WCF サービスのインスタンス モードは ですper-call。したがって、サービスのインスタンスは、呼び出しごとにホストによって作成されます。

注:シングルトン サービスを使用する場合、オペレーションはスレッド セーフ である必要があります。したがって、複数の同時クライアントを処理できるようQueueに、 から に切り替えることをお勧めします。ConcurrentQueue

代替手段:を使用しMSMQ bindingます。これにより、すべての受信メッセージがプロセス外でキューに入れられるため、再起動間でも保持されます。

于 2012-06-27T17:31:11.780 に答える