我用OPC服务器编写XML AJAX服务。基于this示例的XML AJAX服务。 我用单一属性制作了我的服务:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
接下来我将创建类析构函数:
~BoilerService()
{
try
{
ReadTimer.Dispose();
group.ReadCompleted -= new ReadCompleteEventHandler(group_ReadCompleted);
group.Remove(true);
server.Disconnect();
}
catch (Exception e)
{
System.IO.StreamWriter sw = new System.IO.StreamWriter("log.txt", true);
sw.WriteLine(DateTime.Now.ToString() +e.Message+ " "+ e.Source+" "+e.StackTrace + " destructor called.");
sw.Close();
sw.Dispose();
}
}
但是当我在VS中重建我的解决方案(在app路径中替换的文件)时,我得到了wp3.exe未处理的异常错误窗口(Windows 7)。在Windows事件日志中,我看到以下文字:
Exception: System.Runtime.InteropServices.InvalidComObjectException
Message: COM object that has been separated from its underlying RCW cannot be used.
StackTrace: at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, Boolean& pfNeedsRelease)
at OPC.Data.Interface.IOPCServer.RemoveGroup(Int32 hServerGroup, Boolean bForce)
at OPC.Data.OpcGroup.Remove(Boolean bForce)
at OPC.Data.OpcGroup.Finalize()
我做错了什么?
VS 2010发出警告: 1.'System.Runtime.InteropServices.UCOMIEnumString'已废弃:'使用System.Runtime.InteropServices.ComTypes.IEnumString代替。 http://go.microsoft.com/fwlink/?linkid=14202”。 2.'System.Runtime.InteropServices.UCOMIConnectionPointContainer'已废弃:'使用System.Runtime.InteropServices.ComTypes.IConnectionPointContainer。 http://go.microsoft.com/fwlink/?linkid=14202“
由于此警告,可能会出现此错误吗?
答案 0 :(得分:5)
两个对象的终结器不保证以任何特定顺序运行,即使一个对象引用另一个对象。也就是说,如果对象A具有对象B的引用并且两者都具有终结器,则当对象A的终结器开始时,对象B可能已经完成。
这意味着,如果group
与您的OpcGroup
实例(看起来非常可能)同时可以收集,那么group
可能已经最终确定这很容易成为你失败的原因。
看起来你来自C ++背景,在这种情况下你应该意识到终结者在C#中的工作方式不同 - 你需要实现终结者的非常罕见。我建议您不要在终结器中进行清理,而是实现IDisposable
,并在处理对象时执行此操作。
此外,您通常不需要取消挂钩事件处理程序(除非该事件仍然可能被触发,并且可能在对象被处置后导致异常)。这种清理是为你处理的。