2012-02-09 82 views
0

我們有一個簡單的wpf應用程序,它連接到本地機器上運行的服務。我們使用命名管道進行連接,然後註冊回調,以便稍後服務可以向客戶端發送更新。在命名管道上使用WCF GetCallbackChannel發生內存泄漏

的問題是,有回調的每次通話,我們得到的內存在客戶端應用程序建立。

這是客戶端連接到服務的方式。

const string url = "net.pipe://localhost/radal"; 
_channelFactory = new DuplexChannelFactory<IRadalService>(this, new NetNamedPipeBinding(),url); 

,然後在一個線程池線程我們循環執行以下操作直到我們連接

var service = _channelFactory.CreateChannel(); 
service.Register(); 

service.Register看起來像這樣在服務器端

public void Register() 
{ 
    _callback = OperationContext.Current.GetCallbackChannel<IRadalCallback>(); 
    OperationContext.Current.Channel.Faulted += (sender, args) => Dispose(); 
    OperationContext.Current.Channel.Closed += (sender, args) => Dispose(); 
} 

此回調存儲當新數據到達時,我們在服務器端調用以下內容。

void Sensors_OnSensorReading(object sender, SensorReadingEventArgs e) 
{ 
    _callback.OnReadingReceived(e.SensorId, e.Count); 
} 

其中參數是int和double。在客戶端上,處理如下。

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

但是我們發現註釋掉_event.Publish ...對內存使用沒有任何影響。有沒有人看到這可能是內存泄漏的任何邏輯原因。我們已經使用一個分析器來跟蹤這個問題,但是找不到構建什麼類型的對象。

回答

1

我現在可以部分回答這個問題。這個問題部分是由於我們試圖變得聰明,讓連接在另一個線程上打開,然後將其傳遞迴主要的GUI線程。解決方案是不使用線程,而是使用調度計時器。它的缺點是,初始數據加載現在在GUI線程上,但我們無法加載所有這些。

然而,這並不是整個解決方案(實際上我們並沒有一個完整的解決方案)。一旦我們轉向更好的分析器,我們發現構建的對象是超時處理程序,所以我們禁用了該功能。這對我們來說是好的,因爲我們總是對本地主機運行,但我可以想象,對於使用遠程服務的人來說,這將是一個問題。