保持缓存数据在同一台机器上的diff WPF应用程序之间共享的最佳方法是什么?

时间:2009-01-30 03:42:08

标签: wcf dataset

我正在考虑将数据保存在WCF托管服务中的DataSet中,而其他应用程序(在同一个盒子上)可以通过命名管道(通过WCF服务公开)访问数据。然后,应用程序会在其中保留dataSet的副本,以便不会从WCF重新获取数据,除非它被更改。

以datarow集合的形式从服务器检索数据,因此我将其写为DataTables并将其存储为Dataset

数据很少会改变,但是当它发生时,我必须通知所有已检索数据的客户端应用程序。

2 个答案:

答案 0 :(得分:0)

您的解决方案可行。如果您可以访问适当的缓存服务,例如ScaleOut StateServer,Velocity或memcached,则可以根据需要使用它。它可以做同样的事情,但是您将获得一个经过验证的解决方案,其中包含有关缓存管理的其他功能,以及在需要时扩展到多台计算机的能力。

答案 1 :(得分:0)

我用我写的应用程序做了类似的事情。

您可以使用回调轻松让服务在数据更改时更新客户端。当客户端连接到服务时,您需要存储他们的回调信息,当数据更新时,您只需将消息发送给每个订阅的客户端。

以下是回调合约:

public interface IServiceMessageCallback
{

    [OperationContract(IsOneWay = true)]
    void OnReceivedServiceMessage(ServiceMessage serviceMessage);
}

该服务实现此接口。该服务有这个私人领域:

    /// <summary>
    /// Holds the callback recipients
    /// </summary>
    private List<IServiceMessageCallback> callbackMessages = 
              new List<IServiceMessageCallback>();

当客户端连接时,请执行以下操作:

    IServiceMessageCallback callback = 
       OperationContext.Current.GetCallbackChannel<IServiceMessageCallback>();
    callbackMessages.Add(callback);

最后,无论你有什么方法更新服务上的数据,都应该有:

    Action<IServiceMessageCallback> fire =
         delegate(IServiceMessageCallback callback)
             { callback.OnReceivedServiceMessage(serviceMessage); };

    // loop thru the callback channels and perform the action
    callbackMessages.ForEach(fire);

我把这段代码从我写的一个相当沉重的服务中修补了......希望这些内容在上下文中是有意义的。