使用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

使用ActivationOption.Server处理ServicedComponent中的共享成员

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秒超时