AppDomains,Unloading和ThreadAbortException

时间:2014-03-23 17:53:25

标签: c# .net multithreading appdomain

我第一次尝试使用AppDomains而且我发现自己有点迷失。

这就是我所做的: 我有一个控制台应用程序,它实例化一个Bootstrapper类并调用Bootstrapper.Bootstrap。

该课程看起来像这样:

    public class Bootstrapper : MarshalByRefObject
    {
        private static AppDomain SecondaryAppDomain;
        private Bootstrapper _secondaryDomainBootstrapper;
        public Robot CurrentlyRunningRobot;
        public Bootstrapper OwningBootstrapper;

        public Bootstrapper()
        {

        }

        public void Bootstrap()
        {
            InitializeSecondaryAppDomain();
            RunInSecondaryAppDomain();
        }

        private void DestroySecondaryAppDomain()
        {
            AppDomain.Unload(SecondaryAppDomain);
        }

        private static int initCount = 0;

        private static void InitializeSecondaryAppDomain()
        {
            initCount++;
            SecondaryAppDomain = AppDomain.CreateDomain("SecondaryAppDomain" + initCount);
        }

        private void RunInSecondaryAppDomain()
        {
            _secondaryDomainBootstrapper =
                (Bootstrapper)
                    SecondaryAppDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName,
                        "myNamespace.Bootstrapper");
            _secondaryDomainBootstrapper.OwningBootstrapper = this;
            _secondaryDomainBootstrapper.Initialize(Args);
        }        

        private void Initialize(string[] args)
        {
            //Do some stuff...
            //Start() returns Task<Robot>
            var robot = Initializer.Start();
            CurrentlyRunningRobot = robot.Result;
            CurrentlyRunningRobot.HardResetRequested += OnHardResetRequested;
            robot.Wait();
        }

        private void DoHardReset()
        {
            DestroySecondaryAppDomain();
            InitializeSecondaryAppDomain();
            RunInSecondaryAppDomain();
        }

        private void OnHardResetRequested(object sender, EventArgs e)
        {
            OwningBootstrapper.DoHardReset();
        }
    }

意图是在辅助域中运行的任何内容并请求终止并重新启动它。

但是,当我调用DestroySecondaryAppDomain()(来自默认的AppDomain)时,我发现了ThreadAbortExceptions。

我一直在阅读一堆文档,这似乎完全正常。我遇到困难的是为什么我似乎无法在我的默认AppDomain中处理它。

当卸载辅助AppDomain时(在DestroySecondaryAppDomain中),我永远不会执行DoHardReset中的其余代码。什么(可能是简单的)我无法理解?

1 个答案:

答案 0 :(得分:1)

总而言之,该AppDomain中仍然存在代码执行。它需要完全停止才能成功卸载而不会出错。