我有一个非常简单的WCF服务,它只能作为计算器添加两个数字。
[ServiceContract(Namespace = "Calculating")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
}
// Implementation of the ICalculator interface.
public class CalculatorServer : ICalculator
{
public double Add(double n1, double n2)
{
double result = n1 + n2;
return result;
}
}
同样,我有一个非常简单的WCF客户端,它使用ChannelFactory
调用Calculator接口。
var endpointAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service");
var factory = new ChannelFactory<ICalculator>(new WSHttpBinding(), endpointAddress);
ICalculator proxy = factory.CreateChannel();
Console.WriteLine(proxy.Add(5, 3));
factory.Close();
这段代码工作正常,但是我正在努力创建一个方法,一旦服务启动,该方法将使用工作线程自动被接口调用。我想要做的是,当主线程收到计算器的请求时,工作线程将每五秒打印一条消息。所以我尝试在我的接口实现中添加一个构造函数来调用这个方法:
private bool isAlive;
public CalculatorServer()
{
isAlive = true;
// Queue the main service function for execution in a worker thread.
ThreadPool.QueueUserWorkItem(new WaitCallback(ServiceWorkerThread), isAlive);
}
private void ServiceWorkerThread(object state)
{
isAlive = (bool)state;
// Periodically check if the service is stopping.
while (this.isAlive)
{
Console.WriteLine("This is a message!");
Thread.Sleep(5000); // sleep for five seconds
}
}
但是当我运行我的客户端时,消息不会显示。起初我以为是因为构造函数由于某种原因没有被调用,但是在初始化double
并稍后在Add
方法中使用它之后我知道事实并非如此。那么我做错了什么?请记住,我对WCF和多线程仍然相当新。