我正在开发使用WPF和WCF的客户端/服务器应用程序。 服务器应用程序托管一个WCF服务,负责执行客户端请求并在出现问题时回调它们。在忙于长时间运行的操作时Ping应答WCF服务
服务接口与所有的OneWay
操作定义一个双工回调合同。
(简体)IService
[ServiceContract(CallbackContract = typeof(ISrvServiceCallback))]
public interface ISrvService
{
[OperationContract(IsOneWay = true)]
void Ping();
[OperationContract(IsOneWay = true)]
void LongRunningOperation();
}
public interface ISrvServiceCallback
{
[OperationContract(IsOneWay = true)]
void PingReply();
[OperationContract(IsOneWay = true)]
void LongRunningOperationStatus(string reply);
}
的服务需要十个分量某些对象根据客户端的调用改变状态。出于这个原因,我决定有一个单身人士的服务。
(简体)服务
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SrvService : ISrvService
{
MyObject statusObject;
public void LongRunningOperation()
{
//calling back the client reporting operation status
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>()
.LongRunningOperationStatus("starting long running application");
statusObject.elaborateStatus();
//calling back the client reporting object status
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>()
.LongRunningOperationStatus("object status: " + statusObject.ToString());
}
public void Ping()
{
OperationContext.Current.GetCallbackChannel<ISrvServiceCallback>().PingReply();
}
public SrvService()
{
statusObject= ...statusObject init...
}
}
正如你可以看到我有一个平操作由服务暴露了一个客户端调用(每5秒),以检查是否在服务器应用程序上可用网络(每个客户端有一个服务器连接图标与红色 =服务器不可用,绿色 =服务器不可用)。
当客户端请求长时间运行的操作,启动服务器上运行的工作,不能回复ping请求(客户端的服务器连接图标变为红色)。
一旦长时间运行的操作完成时,服务器回应所有由客户提出的要求和服务器连接图标重新变绿)。
我想找到一种方法来开发服务,以便服务器始终回应ping请求,也是在长时间运行时。
- 我怎么能做到这一点考虑,我需要保持
InstanceContextMode.Single
到十个分量的 服务对象的状态? - 是否有其他/更好的方法来ping WCF服务 可用性和可视化显示客户端上的结果?
谢谢你的回复@ plast1k!我对异步知识很少,而且我实际上也在探索这个领域。 客户端使用调用_ThreadPool.QueueUserWorkItem(checkService)_的_DispatcherTimer_来ping服务。 _checkService_调用_serviceClient.Ping()_。 我会看看你发布的所有链接,看看我能如何解决我的问题。 是否有可能有你的异步/等待单例服务实现的一些示例代码?只是想知道如何从客户端调用并从服务器回复。 – aDone
没问题。我应该能够稍后再挖掘一些,如果我找到它,我会编辑我的帖子。 – plast1k
@aDone示例添加,对不起,花了这么久! – plast1k