C# 我神秘地向我的目标召唤
我遇到了一个奇怪的问题: 我有一个对象(在简化视图中)如下所示:C# 我神秘地向我的目标召唤,c#,.net,wcf,C#,.net,Wcf,我遇到了一个奇怪的问题: 我有一个对象(在简化视图中)如下所示: public class LogService : ILogProvider { private ServiceHost host; public void Open() { // Open Service } public void Dispose() { // host.Dispose(); } } 此对象正作为某个其他类上的字段引用
public class LogService : ILogProvider
{
private ServiceHost host;
public void Open()
{
// Open Service
}
public void Dispose()
{
// host.Dispose();
}
}
此对象正作为某个其他类上的字段引用
偶尔在我的应用程序中,我会重新创建服务(我猜这会导致收集LogService对象)
然而,我看到正在调用LogService的Dispose()方法,尽管我没有在代码库中的任何地方直接调用它
在调试时,Visual Studio“调用堆栈”中的调用方是“外部”的,因此我无法查看它
这是什么原因造成的?调用时,主机字段为null,并抛出null引用
以下是失败的调用堆栈:
Executer.dll!Executer.LogService.Dispose()行54+0x6字节C#System.ServiceModel.dll!System.ServiceModel.Dispatcher.InstanceBehavior.InstanceProvider.ReleaseInstance(System.ServiceModel.InstanceContext
instanceContext,对象实例)+0x25字节System.ServiceModel.dll!System.ServiceModel.Dispatcher.InstanceBehavior.ReleaseInstance(System.ServiceModel.InstanceContext instanceContext,对象实例)+0x35字节
System.ServiceModel.dll!System.ServiceModel.InstanceContext.SetUserObject(对象 newUserObject)+0x4e字节
System.ServiceModel.dll!System.ServiceModel.InstanceContext.Unload()文件 +0xf字节System.ServiceModel.dll!System.ServiceModel.InstanceContext.OnClose(System.TimeSpan 超时)+0x1f字节
System.ServiceModel.dll!System.ServiceModel.Channel.CommunicationObject.Close(System.TimeSpan 超时)+0x172字节
System.ServiceModel.dll!System.ServiceModel.InstanceContext.CloseIfNotBusy() +0x76字节System.ServiceModel.dll!System.ServiceModel.InstanceContext.NotifyEmpty(System.ServiceModel.InstanceContext instanceContext)+0xb字节
System.ServiceModel.dll!System.ServiceModel.ServiceChannelManager.OnEmpty() +0x16字节System.ServiceModel.dll!System.ServiceModel.Channels.LifetimeManager.DecrementBusyCount() +0xbc字节System.ServiceModel.dll!System.ServiceModel.ServiceChannelManager.ChannelRemoved(System.ServiceModel.Channels.IChannel 通道)+0x37字节
System.ServiceModel.dll!System.ServiceModel.ServiceChannelManager.RemoveChannel(System.ServiceModel.Channels.IChannel 通道)+0x42字节
System.ServiceModel.dll!System.ServiceModel.ServiceChannelManager.OnChannelClosed(对象 发送方,System.EventArgs args)+0x16字节
System.ServiceModel.dll!System.ServiceModel.Channels.CommunicationObject.OnClosed() +0xd5字节System.ServiceModel.dll!System.ServiceModel.Channels.CommunicationObject.Abort() +0xcf bytes System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.OnInNerchannelFault(对象 发送方,System.EventArgs e)+0x46字节
我没有答案给你,但我有这个想法。你可能是对的。这意味着ServiceHost在LogService之前被释放 如果这是真的,那么我不明白为什么日志服务中的ServiceHost为null。只有当对ServiceHost的dispose也将其所有引用设为null时,才能执行此操作。这让我很难相信,但也可能是我缺乏知识(也许有人能证实)。所以我创建了一个小测试,它应该通过抛出一个空引用异常来验证这一点,但它没有
public interface ILogProvider : IDisposable
{
void Open();
}
public class LogService : ILogProvider
{
private readonly ServiceHost host;
public LogService(ServiceHost host)
{
this.host = host;
}
public void Open()
{
// Open Service
}
public void Dispose()
{
host.Dispose();
}
}
public class ServiceHost : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~ServiceHost()
{
Dispose(false);
}
public virtual void Dispose(bool disposing)
{
if (disposing)
{
//do managed cleanup
}
// do unmanaged cleanup here
}
}
internal class Program
{
private static void Main(string[] args)
{
var host = new ServiceHost();
using (LogService log = new LogService(host))
{
host.Dispose();
}
}
}
测试首先处理服务主机
,然后调用处置日志服务
,而不引发异常。因此,除非处置ServiceHost
的实现方式完全不同(这很容易),否则您必须检查LogService
是如何创建的。它真的总是引用ServiceHost
希望这能帮你找到正确的方向。如果您解决了问题,也请提供答案。您是否在任何地方使用语句在
中包装LogService
的创建?ILogProvider是否实现IDisposable?Martijn是正确的。我们需要知道这是标准IDisposable.Dispose()还是一些不符合标准的Dispose()@MartijnB好吧,OPs是这样的:他们经常忘记提到真正重要的事情:)ILogProvider是一个接口,而不是一个类。我将添加外部堆栈跟踪。