gpt4 book ai didi

WCF 服务和 IDisposable,我是否清理托管对象?

转载 作者:行者123 更新时间:2023-12-03 21:48:57 25 4
gpt4 key购买 nike

我已经这样实现了 WCF 服务:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single, UseSynchronizationContext=false)]
public sealed class SynchronizationService : ISynchronizationService, IDisposable
{
private MemoryStream objectStream;

...
}

ISyncrhonizationService 具有 [ServiceContract(SessionMode = SessionMode.Required)]。

如果客户端正确通信并最终使用 [IsTerminating=true] 调用方法,那么我可以很好地处理 objectStream 变量。如果由于某种原因服务和客户端之间的通信中断,我想自己从服务端清理 objectStream 变量,这就是我要实现 IDisposable 接口(interface)的原因。但是查看 MSDN 文档( http://msdn.microsoft.com/en-us/library/system.idisposable.aspx)我对此有点怀疑,因为根据文档:
    // Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user's code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.

因为运行时会调用 Dispose 方法,然后 disposing = false。因此我不应该访问 objectStream,因为它是一个托管对象。在这种情况下,运行时提供的 SyncrhonizationService 终结器应该清理 objectStream 本身,我根本不需要实现 IDisposable。然而,一些论坛帖子表明,SyncrhonizationService 实例将被重用而不是处置/最终确定。

所以我的问题是:

1) 在异常/故障/超时/等期间,SyncrhonizationService 实例实际发生了什么?以后会被丢弃还是简单地重复使用?

2) 我是否需要实现 IDisposable 并在 Dispose() 方法中处理托管对象?

3) 是否有比 IDisposable 更好的替代方案,例如 channel_Faulted 事件?如果我确实在此类事件中处理了我的托管对象,我将如何以及在何处删除事件处理程序(我可以在事件处理程序中执行此操作,但如果发生另一种类型的异常/故障怎么办)?

最佳答案

如果您实现 IDisposable,您可以在 Dispose() 方法的实现中清理托管对象。

使用 PerSession InstanceContextMode,WCF 运行时将在 session 结束时调用 SynchronisationService 对象上的 Dispose,无论是因为客户端关闭了他的代理;由于 session 因不活动而超时(在客户端或服务器上);或通过 channel 故障。

服务实例不会被重用:新 session 将获得 SynchronisationService 的新实例。

关于WCF 服务和 IDisposable,我是否清理托管对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4264746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com