c#中调用Web服务的非托管泄漏
本文关键字:泄漏 服务 调用 Web | 更新日期: 2023-09-27 18:02:47
我需要帮助我的代码。
我一直在尝试使用RedGate来监控我的应用程序的内存使用情况,经过几个小时的测试,它指出了我的应用程序的非托管代码,我只能认为我的web服务调用是我的代码中唯一或有些非托管的部分。我调试了几个小时,似乎找不到哪里或什么真正发生了。下面是我的代码。
private void btnstart_Click(object sender, EventArgs e)
{
btnPressed = !btnPressed //boolean
if(btnPressed)
{
myTask = Task.Factory.StartNew(() =>
{
do {
_checkMatches(token.Token);
} while (token.IsCancellationRequested != true);
},token.Token);
}
else
{
token.Cancel();
try {
Task.WaitAny(myTask);
}
catch(Exception Error) {
//Put to logs
}
finally
{
if(myTask.isCancelled || myTask.IsCompleted || myTask.IsFaulted)
{
myTask.Dispose();
}
}
}
}
private void _checkMatches(CancellationToken token)
{
try
{
if(token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
EndpointAddressBuilder ServiceEndPoint = new EndpointAddressBuilder(//Read Endpoint From Notepad);
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });//just bypassing validation for test purposes
// WebService is an ASMX web service
using (WebService.SoapClient client = new WebService.SoapClient())
{
WebService.checkResponse clientRes = client.checkClient();
if(clientRes.response == 1 || clientRes.response == 2) {
//Put to Logs
}
}
}
catch(Exception error){
//Put to logs
}
}
在这段代码中我似乎找不到任何错误。有人可以帮助我的问题是什么,为什么我的非托管代码正在泄漏?或者有人可以建议使用什么工具,甚至建议找到我的代码的泄漏部分?
如果你正在使用RedGate内存分析器,它应该告诉你的不仅仅是指向非托管资源。因为您没有直接创建任何未修改的资源,所以内存泄漏很可能是由托管对象或事件订阅(或回调订阅)引起的。
具有非托管资源的标准。net管理对象(即:WebService.SoapClient)已经实现了终结器(析构器),以便在任何情况下,如果Dispose未被调用,都可以摆脱其非托管资源。如果你使用一个标准的。net托管对象,它有非托管的资源,并且不调用dispose(这是不好的),它仍然会在结束时释放未受管理的资源。一般来说,这不会导致非托管资源内存泄漏。
如何检查是否有内存泄漏:
执行内存消耗逻辑几次。转到Instance列表,查看是否有正在增长的实例。选择"Objects with Source"选项,以摆脱成堆的系统对象。如果存在任何内存泄漏,您应该看到更多的实例。
如果有任何增长的实例,选择一个并查看对象保留图,该图将显示哪个实例持有引用。
并且,确保您已经正确地实现了IDisposable,并处理所有一次性对象,并取消订阅所有事件订阅。
请看下面的演练
http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/walkthrough http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/