代码之家  ›  专栏  ›  技术社区  ›  Matthew Scharley

我应该如何优雅地处理有故障的AppDomain?

  •  3
  • Matthew Scharley  · 技术社区  · 15 年前

    这段代码设计不当吗?原来只有一个 AppDomain.Unload ,在finally块中。这有一个不实际的副作用,其他线程可以在AppDomain中继续运行,而 UnhandledException 正在运行,这其中包括使用用户输入,因此在计算规模上非常慢(实际运行时间平均可能为1分钟),可能引发其他异常,通常会导致更多问题。我一直在想一个更好的方法来做这件事,所以,我把这件事提交给了SO。把你的想法借给我。

    注: 我刚刚意识到这里也存在同步问题。是的,我知道他们是什么,让我们保持专注。

    mainApp = AppDomain.CreateDomain(ChildAppDomain, null, AppDomain.CurrentDomain.SetupInformation);
    try
    {
        mainApp.ExecuteAssembly(Assembly.GetEntryAssembly().Location);
        finished = true;
    }
    catch (Exception ex)
    {
        AppDomain.Unload(mainApp);
        mainApp = null;
        UnhandledException(this, new UnhandledExceptionEventArgs(ex, false));
    }
    finally
    {
        if (mainApp != null)
        {
            AppDomain.Unload(mainApp);
            mainApp = null;
        }
    }
    
    // ...
    
    void UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        if (mainApp != null)
        {
            AppDomain.Unload(mainApp);
            mainApp = null;
        }
        // [snip]
    }
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Peter Lillevold Rene    15 年前

    我会努力避免重复。在我看来,你只需要清理最后一个块中的AppDomain就可以完成这项工作,就像你最初做的那样。其思想是,如果发生未处理的异常,请将其放在变量中,并在关闭AppDomain后对其进行处理。

    Exception unhandledException = null;
    try
    {
        ...
    }
    catch (Exception ex)
    {
        unhandledException = ex;
    }
    finally
    {
        CleanupAppDomain(mainApp);
    }
    
    if (unhandledException != null)
        UnhandledException(this, new UnhandledExceptionEventArgs(unhandledException, false));