簡體   English   中英

AppDomains,卸載和ThreadAbortException

[英]AppDomains, Unloading, and ThreadAbortException

我第一次嘗試與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中的其余代碼。 我無法理解什么(可能很簡單)?

簡而言之,該AppDomain中仍在執行代碼。 必須先將其完全停止,然后才能成功將其正確卸載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM