首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中应用于延迟卸载动态创建的多个AppDomains的最佳线程实践

在C#中应用于延迟卸载动态创建的多个AppDomains的最佳线程实践
EN

Stack Overflow用户
提问于 2015-05-21 21:08:00
回答 1查看 521关注 0票数 1

考虑一个创建30个应用程序域的应用程序,然后运行它们(每个应用程序域在自己的线程中),当每个应用程序域完成运行(也就是线程退出等等)时,我们需要为每个appdomain运行一些自定义的清理逻辑+卸载appdomain本身的调用。

对每个应用程序域的清理逻辑+appdomain卸载调用可能需要不止一次尝试才能成功(因为涉及到资源,需要系统释放时间等等)。如果不能在一次特定的尝试中执行清理操作,那么我们不需要超过100 us就可以知道这一点并继续前进。

在C#的世界里,以“后台执行清理”的方式执行这种清理的最佳实践是什么?在我头上有可能的场地:

  1. 每个应用程序域清理都应该在自己的“新线程()”角落执行。每个线程在带睡眠间隔的while循环中持续存在,以防需要重试。
  2. 只有一个具有任务队列的专用长线程,在该线程中,我们提交要清理和卸载的每个appdomain (同样是以持久性的方式,如上面的方法#1 )。
  3. 使用线程池并在那里提交清理任务。

根据以下评论:

https://stackoverflow.com/a/28651533/863651

如果方法在开始执行时不能在100 or左右内退出,则该方法应该通过主线程池以外的一些方法执行。但是,如果一个方法将花费一秒钟或更长时间执行,并且大部分时间将被阻塞,则该方法很可能在一个专用线程中运行,并且几乎肯定不应该在主线程池线程中运行。

我想这阻碍了使用上面的方法#3。我想知道method#2是否比方法1有相当大的优势。最让我困扰的是,尽管method#2需要稍微多一点编码,但无论如何它只使用一个线程,而method#2将需要N个线程来处理N个应用程序域(这就需要生成线程等)。

对于任何可能实现这种机制的method#4+,我都持开放态度。我只是好奇其他程序员是如何在这样的问题上应用“最佳线程实践”的概念的。

提前谢谢。

P.S.:此应用程序将在当代桌面计算机上运行(在撰写本文时)。

EN

回答 1

Stack Overflow用户

发布于 2015-05-22 17:32:50

假设您知道在管理AppDomains时需要清理哪些内容,您可以将清理逻辑附加到DomainUnload事件,如下所示:

代码语言:javascript
运行
复制
appDomain.DomainUnload += 
  (sender, args) => 
  {
       //this logic needs to be specific for each AppDomain.

       //you can consider using a class like BackgroundWorker to do the work.

  };

对于单线程还是多线程问题,只要您使代码线程安全,那么我的看法是,多线程选项既可以减少代码行(始终是我的目标),也可以优化性能,特别是如果将清理作为后台线程运行的话。就挖掘系统资源而言,10 s线程实际上不是一个问题(除非清理操作可能耗尽内存)。主要的缺点是多线程程序有时调试起来可能更棘手,但我敢打赌,在这种情况下,您一定会没事的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30384342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档