使用ActivationOption.Server处理ServicedComponent中的共享成员
本文关键字:共享 成员 ServicedComponent ActivationOption Server 处理 使用 | 更新日期: 2023-09-27 18:13:28
由于几个原因,我需要在。net Framework 4中创建一个COM+组件。目的是在其自己的进程(dllhost.exe)中托管组件,因此使用ActivationOption.Server.
我的组件代码需要在对象激活之间持久化数据,这是由工作线程维护的。这个工作线程及其数据保存在基类的静态(共享)成员中。共享数据独立于调用者、其安全上下文、事务等。同时,工作线程对数据执行后台处理。
我需要在处理dllhost进程时清理数据并有序地终止工作线程。由于没有静态(共享)析构函数,我不知道如何做到这一点。继承ServicedComponent时,我能实现什么吗?还有其他想法吗?谢谢你。
下面是一些开始的代码:
Imports System.EnterpriseServices
<Assembly: ApplicationName("MySender")>
<Assembly: ApplicationActivation(ActivationOption.Server)>
<ClassInterface(ClassInterfaceType.None), ProgId("MySender.Sender")> _
<Transaction(EnterpriseServices.TransactionOption.NotSupported)> _
Public Class Sender
Inherits ServicedComponent
Implements SomeLib.IMsgSender
Shared worker As myWorker
Shared sync As New Object
Public Sub MyInstanceMethod(msg as string) Implements SomeLib.IMsgSender.SendMessage
SyncLock sync
If worker Is Nothing Then
worker = New myWorker
worker.StartThread()
End If
End SyncLock
worker.Process(msg)
End Sub
'Something like this does not exist!'
Shared Sub Dispose()
SyncLock sync
If worker IsNot Nothing Then
worker.StopThread()
End If
End SyncLock
End Sub
End Class
AppDomain。processsexit事件将在卸载域之前触发。如果要运行的代码不需要太长时间,可以这样使用:
Imports System.EnterpriseServices
<Assembly: ApplicationName("MySender")>
<Assembly: ApplicationActivation(ActivationOption.Server)>
<ClassInterface(ClassInterfaceType.None), ProgId("MySender.Sender")> _
<Transaction(EnterpriseServices.TransactionOption.NotSupported)> _
Public Class Sender
Shared Sub New
AddHandler AppDomain.CurrentDomain.ProcessExit, AddressOf MyDisposalCode
End Sub
'....
Shared Sub MyDisposalCode(sender as Object, e as EventArgs)
'My disposal code
End Sub
End Class
需要注意的是,. net将在此代码上强制2秒超时