Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中应用的最佳线程实践,用于延迟卸载动态创建的多个AppDomain_C#_Multithreading_Background_Task_Lazy Evaluation - Fatal编程技术网

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

在C#中应用的最佳线程实践,用于延迟卸载动态创建的多个AppDomain,c#,multithreading,background,task,lazy-evaluation,C#,Multithreading,Background,Task,Lazy Evaluation,考虑让一个应用程序创建30个应用程序域,然后运行它们(每个应用程序域在其自己的线程中),当这些应用程序域中的每个应用程序域完成运行时(即其线程退出等),我们需要通过为每个应用程序域运行一些自定义清理逻辑+卸载应用程序域本身的调用来进行清理 每个应用程序域的清理逻辑+appdomain卸载调用可能需要多次尝试才能成功(因为涉及资源,需要系统释放时间等等)。如果清理操作无法在特定尝试中执行,我们不需要超过100毫秒就可以了解这一点并继续 在C#世界中,以“在后台执行清理”的方式执行此类清理的最佳实践

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

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

在C#世界中,以“在后台执行清理”的方式执行此类清理的最佳实践是什么?我脑海中可能出现的地点:

  • 每个应用程序域清理都应该在其自己的“new Thread()”角中执行。每个线程都会在一个while循环中保持一个睡眠间隔,以防需要重试

  • 只有一个专用的长时间运行线程和一个任务队列,我们在其中提交要清理和卸载的每个appdomain(同样以持久方式,如上面的方法#1)

  • 使用线程池并在那里提交清理任务

  • 根据以下评论:

    “如果一个方法不能在开始执行时的100毫秒内退出,则该方法应通过主线程池以外的其他方式执行。[…]但是,如果一个方法需要一秒钟或更长的时间才能执行,并且大部分时间都会被阻塞,那么该方法很可能会在专用线程中运行,几乎肯定不会在主线程池线程中运行。”

    我想这不利于使用上述第3种方法。我想知道方法2是否比方法1有相当大的优势。困扰我的主要问题是,尽管方法2需要稍微多一些编码,但不管怎样,它只使用1个线程,而方法2需要N个应用程序域使用N个线程(这需要产生线程等方面的所有成本)

    我愿意接受关于任何可能实现这种机制的方法的建议。我只是想看看其他程序员在遇到这样的问题时是如何应用“最佳线程实践”的概念的

    提前谢谢


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

    假设您知道在管理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秒的线程实际上不是问题(除非清理操作可能会耗尽内存)。主要的缺点是多线程程序有时调试起来比较困难,但我敢打赌在这种情况下你会没事的。请你将你的评论复制粘贴到候选答案中好吗?只是为了与网站的格式保持一致。