我有一个长期运行的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
。
答案 0 :(得分:4)
它不是AppDomain,它是MyObject的remoting lease time。
您可以使用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中的实际作用。如果它持有一些资源或任何长期不能解决的问题,可能最好让它被处理掉并在需要时重新激活它。