Ciao, ho un bel problema con un servizio che esegue WCF in modalità duplex. Invia memoria (non molto ma si tratta di 80 MB al giorno) e dopo aver avuto un profiler di memoria in esecuzione sul servizio per 24 ore ho trovato la maggior parte della memoria seduta in byte[]
riferita da un bel pasticcio ma la maggior parte dei riferimenti termina in qualcosa di simile questo: e il "root" si presenta così: Perdita di memoria in WCF (duplex) sul server
troppo vedo un sacco di ServiceChannel
(circa 200) ritornassi (credo) dalle callback canali.
Sono piuttosto sicuro di tenere solo 1 di questi per ciascun client collegato.
Nel complesso il mio problema sembra essere quasi lo stesso di questo: memory leak in silverlight Wcf implementation ma sul lato server.
Ho anche provato la cosa [MTAThread]
menzionata qui: WCF service leaks handles and memory when a client times out ma non risolve il problema.
Semplicemente non penso che il problema sia con il mio codice mentre avvolgo i canali di callback dopo averlo ottenuto con OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>()
in uno dei miei oggetti e quelli non perdono (ce n'è solo uno per quelli i client in memoria in ogni istantanea data) - sicuro di reimpostare quei callback in diverse occasioni in quanto il canale potrebbe cambiare (i client perdono la connessione o la riconnessione) ma non ho un modo di smaltire i vecchi riferimenti in modo da lasciarli solo e GC dovrebbe fare il suo lavoro su di loro.
Io uso PerCall
sul mio servizio quindi non ho alcuna maniglia per quegli oggetti nel mio codice.
Io davvero non hanno idea di come posso gestire questa parte riavviando il servizio ogni pochi giorni - una soluzione che non voglio probose adesso :(
Quindi, per favore mi dia qualche aiuto/suggerimenti su questo - grazie mille!
Vedete un guadagno di memoria più alto se i client commettono un errore eccessivo e dovete ricreare il canale di callback? Interrompi il canale di callback se il cliente è andato via? –
E 'difficile per me dirlo, ma potrebbe essere il caso - e no non abortire il canale sul server (come posso fare questo - usando 'GetCallbackChannel' Ho solo' T '- devi lanciare questo in una specie di proxy?) –
Carsten
Dovresti essere in grado di trasmetterlo a 'IClientChannel' –