在Windows服务中指定AppDomain的生存期

本文关键字:AppDomain 生存期 Windows 服务 | 更新日期: 2023-09-27 18:16:46

我有一个长期运行的Windows服务,它创建了两个应用程序域。基于应用程序的行为,看起来应用程序域比我想要的更早被丢弃。理想情况下,我希望应用程序域也长时间运行(基本上永远不会得到清理,除非Windows服务关闭)。有办法做到这一点吗?

我使用两次调用的工厂方法创建应用程序域(它创建两种不同类型的对象,每种对象都在自己的应用程序域中),其中包括以下代码(为了简单起见删除了switch语句)…

AppDomain appDomain = AppDomain.CreateDomain(someVariable.ToString());
return (MyObject) appDomain.CreateInstanceAndUnwrap(
                        typeof (MyObject).Assembly.FullName,
                        typeof (MyObject).FullName,
                        false,
                        BindingFlags.NonPublic | BindingFlags.Instance,
                        null,
                        new object[] {id},
                        null,
                        null);

…其中MyObject继承自MarshalByRefObject

在Windows服务中指定AppDomain的生存期

这不是AppDomain,这是MyObject的远程租用时间。

可以通过LifetimeServices类(LeaseTime属性)增加租赁时间。有关更详尽的示例,请参阅链接文章中的Figure 4 Providing New Lease Properties for an Object:

public class MyObject : MarshalByRefObject
{
    public override object InitializeLifetimeService()
    {
        ILease lease = (ILease)base.InitializeLifetimeService();
        Debug.Assert(lease.CurrentState == LeaseState.Initial);
        //Set lease properties 
        lease.InitialLeaseTime = TimeSpan.FromMinutes(30); 
        lease.RenewOnCallTime = TimeSpan.FromMinutes(10); 
        lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); 
        return lease;
    }
}

无论如何,我会将租期时间设置为非常大的值,因为我怀疑您不想定期(在续订时间)手动延长租期时间。然而,这也取决于MyObject在另一个AppDomain中实际做了什么。如果它持有一些资源或任何不能长期发挥作用的东西,也许最好是让它被处理掉,并在需要时重新激活它。