WCF:Dispose()vs IContextChannel.Closed

时间:2017-04-16 07:57:30

标签: c# wcf idisposable

我已经实现了一个WCF服务,每个会话,concurrencymode = multiple,usesynccontext = false,object,它实现了IDisposable,并在其构造函数中获取一个指针(C#)到IContextChannel,并注册事件Closing和闭合。

当客户端连接到我的服务并完成后,我的服务总是首先获得Closing事件,但有时它会跟着调用Dispose()然后关闭事件,有时它会得到首先关闭事件,然后调用Dispose()。我想知道(a)为什么,以及(b)如何解决它,所以我知道什么时候扔东西。

我的C#服务在非托管代码中使用了东西。它也异步关闭。当我收到结束活动时,我开始关闭事情。在Dispose()或Closed中,我需要等待那些不受管理的东西消失(因为对服务的另一次调用必然会分配和使用这些资源)。所以,我等待。

我的想法是,一旦在我的服务上调用Dispose(),我设置为接收Closed的事件可能会遇到与GC清理我的对象的竞争条件。也许我不太了解Dispose()。我想到在调用Dispose()之后我无法查看C#对象的内容。但是如果在Dispose()之后进入Closed事件,我需要查看C#对象的内容并释放它们。也许Dispose()只是让我有机会抛出东西,我的对象仍然有效,直到对象析构函数(Finalizer!)被调用?因此我不需要担心?

1 个答案:

答案 0 :(得分:1)

没有代码就不清楚了,对于一个变通方法你可以使用一个标志并在关闭事件上设置这个标志并在Dispose()中检查值,如果遇到清理,你也可以从Closed()调用dispose()显式设置标志值后的事件处理程序,

你可以将你的旗帜定义为bool" IsClosedEventHandled = true / false"