命名管道上使用WCF GetCallbackChannel的内存泄漏

命名管道上使用WCF GetCallbackChannel的内存泄漏,wcf,Wcf,我们有一个简单的wpf应用程序,它连接到本地机器上运行的服务。我们为连接使用命名管道,然后注册回调,以便稍后服务可以向客户端发送更新 问题是,每次回调调用都会在客户端应用程序中积累内存 这就是客户端连接到服务的方式 const string url = "net.pipe://localhost/radal"; _channelFactory = new DuplexChannelFactory<IRadalService>(this, new NetNamedPipeBinding

我们有一个简单的wpf应用程序,它连接到本地机器上运行的服务。我们为连接使用命名管道,然后注册回调,以便稍后服务可以向客户端发送更新

问题是,每次回调调用都会在客户端应用程序中积累内存

这就是客户端连接到服务的方式

const string url = "net.pipe://localhost/radal";
_channelFactory = new DuplexChannelFactory<IRadalService>(this, new NetNamedPipeBinding(),url);
在服务器端,注册看起来像这样

public void Register()
{
    _callback = OperationContext.Current.GetCallbackChannel<IRadalCallback>();
    OperationContext.Current.Channel.Faulted += (sender, args) => Dispose();
    OperationContext.Current.Channel.Closed += (sender, args) => Dispose();
}
其中参数为int和double。在客户端上,这是按如下方式处理的

public void OnReadingReceived(int sensorId, double count)
{
    _events.Publish(new SensorReadingEvent(sensorId, count));
}

但我们发现,评论出事件。发布。。。对内存使用没有影响。有人知道这可能是内存泄漏的逻辑原因吗。到目前为止,我们使用了探查器来跟踪问题,但无法找到正在生成的对象类型。

现在我可以部分回答这个问题。问题的部分原因是我们试图变得聪明,在另一个线程上打开连接,然后将其传递回主gui线程。解决方案是不使用线程,而是使用调度计时器。它的缺点是,初始数据加载现在在GUI线程上,但我们并没有加载那么多

然而,这并不是完整的解决方案(实际上我们没有完整的解决方案)。一旦我们转向更好的分析器,我们发现构建的对象是超时处理程序,所以我们禁用了该功能。这对我们来说没关系,因为我们总是在本地主机上运行,但我可以想象,对于使用远程服务的人来说,这将是一个问题

void Sensors_OnSensorReading(object sender, SensorReadingEventArgs e)
{
    _callback.OnReadingReceived(e.SensorId, e.Count);
}
public void OnReadingReceived(int sensorId, double count)
{
    _events.Publish(new SensorReadingEvent(sensorId, count));
}