c# - 使用 IRegisteredObject 时强制卸载 Appdomain

标签 c# asp.net iis

我们有一些在 IIS ASP.NET 网站上运行的后台进程。为了防止这些进程在应用程序回收时死掉,我们实现了一个 IRegisteredObject 实例,我们在其中等待服务器上的工作完成,然后再卸载应用程序域(参见下面的人为示例)。

我们的代码按预期工作,但是当我们进行部署时 - 旧的应用程序域一直存在,直到我们想要的工作完成(我们想要的) - 然而,随着频繁的部署/大量工作 - 我们遇到了资源不足的情况我们的虚拟机几乎用完了。

是否有一种外部方式来强制卸载(不管 IRegisteredObject 是否存在)/杀死旧的应用程序域?或者我们可以与旧的应用程序域通信以告诉它在代码内终止的方式?

internal class ShutdownHelper : IRegisteredObject
{
    public ShutdownHelper() {
        HostingEnvironment.RegisterObject(this);
    }

    void IRegisteredObject.Stop(bool immediate)
    {
        if (immediate)
        {
            WaitForAllWorkToComplete(TIMEOUT /* Some arbitrary timeout*/); // This function returns when all processing on the server has completed
            HostingEnvironment.UnregisterObject(this);
        }
        else
        {
            // Similar logic as immediate but run asynchronously and we only unload if the task completes (in a continuation)
        }
    }
}

最佳答案

您可以使用这段代码枚举所有域 Enumerating AppDomains

然后,您可以使用 AppDomain.CreateInstanceAndUnwrap 在远程 AppDomain 上执行代码方法。该域应加载包含此共享类型的程序集。

    CrossAppDomainExecuteStopper stopper = (CrossAppDomainExecuteStopper)appDomain.CreateInstanceAndUnwrap(typeof(CrossAppDomainExecuteStopper).Assembly.FullName, typeof(CrossAppDomainExecuteStopper).FullName);
    stopper.StopWork();

CrossAppDomainExecuteStopper必须继承自MarshalByRefObject

public class CrossAppDomainExecuteStopper : MarshalByRefObject
{
    public void StopWork()
    {
        // force stop the work
    }
}

关于c# - 使用 IRegisteredObject 时强制卸载 Appdomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28730045/

相关文章:

c# - 如何在 MVC5 中手动检查 url 授权?

c# - 从其orderby子句中清除IQueryable

asp.net treeview 仅展开选定的父级

c# - .NET-无法构建项目

一个站点在 IIS 中的 SSL 证书,所有站点都响应 https 请求

powershell - 安装 IIS 作为 Octopus Deploy 中的一个步骤

c# - 配置 WCF 客户端终结点以使用相对地址(对于 Azure)

c# - 在 C# 中合并或添加 2 个列表

c# - 添加 AntiForgeryToken 到非 Ajax 表单提交

c# - DataTable 修改日期格式 - 为什么?