Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我神秘地向我的目标召唤_C#_.net_Wcf - Fatal编程技术网

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是一个接口,而不是一个类。我将添加外部堆栈跟踪。