首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ServicedComponent处理ActivationOption.Server中的共享成员

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

Stack Overflow用户
提问于 2015-09-18 19:12:05
回答 1查看 70关注 0票数 0

出于几个原因,我需要在COM+框架4中创建一个.Net组件,目的是在自己的进程(dllhost.exe)中托管组件,从而使用ActivationOption.Server。

我的组件代码需要在对象激活(由工作线程维护)之间持久化数据。此工作线程及其数据保存在我的基类的静态(共享)成员中。共享数据与调用方、其安全上下文、事务等无关。此外,工作线程对数据执行后台处理。

当dllhost进程被释放时,我需要清理数据并有序地终止工作线程。由于没有静态(共享)析构函数,我不知道如何执行。在继承ServicedComponent时,有什么可以实现的吗?还有其他想法吗?谢谢。

下面是一些开始的代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-03 00:33:47

AppDomain.ProcessExit事件将在卸载域之前触发。如果运行的代码不需要太长时间,可以这样使用:

代码语言:javascript
复制
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秒超时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32659436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档