我正在尝试创建一个简单的Windows服务,它维护一个整数队列,并通过WCF调用接受来自其他应用程序的新整数。我当前的实现似乎为每个与之通信的应用程序维护单独的队列,这不是我想要的。
我首先按照Microsoft How to: Host a WCF Service in a Managed Windows Service上的说明进行操作。
我的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方法在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,然后在第三次打印5和6,依此类推。但是,它每次只返回1和2,就像控制台应用程序实例化对象本身而不是在Windows服务内的对象上操作一样。我不理解的是什么?
答案 0 :(得分:5)
我认为你想要一个singleton
WCF服务。请参阅here。
默认情况下,WCF服务的实例模式为per-call
。因此,主持人会为您进行的每次通话创建服务实例。
注意:使用单件服务时,您的操作需要线程安全。所以我建议从Queue
切换到ConcurrentQueue
,这样就可以处理多个并发客户端。
替代方案:使用MSMQ binding
。这将确保您所有传入的消息都排除在进程之外,因此也会在重新启动之间保持不变。