考虑一个创建30个应用程序域的应用程序,然后运行它们(每个应用程序域在自己的线程中),当每个应用程序域完成运行(也就是线程退出等等)时,我们需要为每个appdomain运行一些自定义的清理逻辑+卸载appdomain本身的调用。
对每个应用程序域的清理逻辑+appdomain卸载调用可能需要不止一次尝试才能成功(因为涉及到资源,需要系统释放时间等等)。如果不能在一次特定的尝试中执行清理操作,那么我们不需要超过100 us就可以知道这一点并继续前进。
在C#的世界里,以“后台执行清理”的方式执行这种清理的最佳实践是什么?在我头上有可能的场地:
根据以下评论:
https://stackoverflow.com/a/28651533/863651
如果方法在开始执行时不能在100 or左右内退出,则该方法应该通过主线程池以外的一些方法执行。但是,如果一个方法将花费一秒钟或更长时间执行,并且大部分时间将被阻塞,则该方法很可能在一个专用线程中运行,并且几乎肯定不应该在主线程池线程中运行。
我想这阻碍了使用上面的方法#3。我想知道method#2是否比方法1有相当大的优势。最让我困扰的是,尽管method#2需要稍微多一点编码,但无论如何它只使用一个线程,而method#2将需要N个线程来处理N个应用程序域(这就需要生成线程等)。
对于任何可能实现这种机制的method#4+,我都持开放态度。我只是好奇其他程序员是如何在这样的问题上应用“最佳线程实践”的概念的。
提前谢谢。
P.S.:此应用程序将在当代桌面计算机上运行(在撰写本文时)。
发布于 2015-05-22 17:32:50
假设您知道在管理AppDomains时需要清理哪些内容,您可以将清理逻辑附加到DomainUnload事件,如下所示:
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线程实际上不是一个问题(除非清理操作可能耗尽内存)。主要的缺点是多线程程序有时调试起来可能更棘手,但我敢打赌,在这种情况下,您一定会没事的。
https://stackoverflow.com/questions/30384342
复制相似问题