在C#中应用的最佳线程实践,用于延迟卸载动态创建的多个AppDomain
考虑让一个应用程序创建30个应用程序域,然后运行它们(每个应用程序域在其自己的线程中),当这些应用程序域中的每个应用程序域完成运行时(即其线程退出等),我们需要通过为每个应用程序域运行一些自定义清理逻辑+卸载应用程序域本身的调用来进行清理 每个应用程序域的清理逻辑+appdomain卸载调用可能需要多次尝试才能成功(因为涉及资源,需要系统释放时间等等)。如果清理操作无法在特定尝试中执行,我们不需要超过100毫秒就可以了解这一点并继续 在C#世界中,以“在后台执行清理”的方式执行此类清理的最佳实践是什么?我脑海中可能出现的地点:在C#中应用的最佳线程实践,用于延迟卸载动态创建的多个AppDomain,c#,multithreading,background,task,lazy-evaluation,C#,Multithreading,Background,Task,Lazy Evaluation,考虑让一个应用程序创建30个应用程序域,然后运行它们(每个应用程序域在其自己的线程中),当这些应用程序域中的每个应用程序域完成运行时(即其线程退出等),我们需要通过为每个应用程序域运行一些自定义清理逻辑+卸载应用程序域本身的调用来进行清理 每个应用程序域的清理逻辑+appdomain卸载调用可能需要多次尝试才能成功(因为涉及资源,需要系统释放时间等等)。如果清理操作无法在特定尝试中执行,我们不需要超过100毫秒就可以了解这一点并继续 在C#世界中,以“在后台执行清理”的方式执行此类清理的最佳实践
备注:此应用程序将在当代桌面计算机上运行(撰写本文时)。假设您知道在管理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.
};
对于单线程与多线程的问题,只要使代码线程安全,那么我的观点是多线程选项将减少代码行(始终是我的目标)并优化性能,特别是在作为后台线程运行cleanup时。就释放系统资源而言,10秒的线程实际上不是问题(除非清理操作可能会耗尽内存)。主要的缺点是,多线程程序有时调试起来比较棘手,但我敢打赌在这种情况下你会没事的 需要执行哪些清理操作,以及什么决定了给定AppDomain何时需要降速?清理操作:写入数据库(SQLite,如果有任何区别)+删除临时文件只是两个标准任务。当AppDomain完成了一系列编码到其中的任务(显示一些c#对话框、运行dos命令、启动应用程序等)后,它就进入了“降速”阶段(如果我理解正确的话,aka就值得进行垃圾收集)。这些任务不是固定的,并且在不同的appdomain之间有所不同(appdomain是动态生成的)。希望这有帮助。域名卸载位+1。对于代码大小的减少是否证明调用30个线程比增加一个线程更合理,但使代码更复杂(使用队列、维护等),我仍然犹豫不决。只要您使代码线程安全,那么我认为您可以减少代码行数(始终是我的目标)并优化性能,尤其是在后台线程运行清理时。就释放系统资源而言,10秒的线程实际上不是问题(除非清理操作可能会耗尽内存)。主要的缺点是多线程程序有时调试起来比较困难,但我敢打赌在这种情况下你会没事的。请你将你的评论复制粘贴到候选答案中好吗?只是为了与网站的格式保持一致。