考虑一个创建多个应用程序域的过程.这些应用程序域是否共享相同的线程池?如果是,它如何在多个应用程序域之间协调?
我有一个运行的Windows服务,从网络驱动器中删除文件夹.我想删除异步.如何才能做到这一点?
现在我循环遍历目录并调用
Directory.Delete(fullPath, true);
Run Code Online (Sandbox Code Playgroud)
谢谢
所以这是一个有效但效率低下的代码的最小版本:
Parallel.ForEach(list, x =>
{
doThing1(x);
});
Thing1Done = true;
Parallel.ForEach(list, x =>
{
doThing2(x);
});
Thing2Done = true;
Parallel.ForEach(list, x =>
{
doThing3(x);
});
Thing3Done = true;
Run Code Online (Sandbox Code Playgroud)
直观地说,我想在同一个循环中运行所有 3 个“事物”,但它们必须能够临时同步以更新各自的Thing*n*Done属性。
这个想法的伪代码如下:
Parallel.ForEach(list, x =>
{
doThing1(x);
// wait for doThing1 to be completed for all other elements in list
Thing1Done = true;
doThing2(x);
// wait for doThing2 to be completed for all other elements in list
Thing2Done = true;
doThing3(x);
// wait for doThing3 to be completed …Run Code Online (Sandbox Code Playgroud) SynchronizationContext除非您在、TaskScheduler、 、 async/await 和多处理方面拥有丰富的经验TaskFactory,否则无需进一步阅读。
在过去的几年里,我参与了一个大型的整体式 C# 项目,该项目从 .NET 2.0 开始,一直升级到我们在过去 15 年里一直致力于开发的 .NET 4.72,并将其迁移到 .NET 5 /6 是为了摆脱现已被有效弃用的 4.72,并最终将其托管在 Linux 上,同时保持其在生产环境中 24/7 运行,拥有超过 100 万用户。
在此过程中,我开始欣赏 async/await 概念的优雅,但也对其表现不明智的地方感到非常沮丧。
我已经接受了大多数怪癖,但通过这个过程,.NET Core(此时为 .NET 6)似乎是一个主要用于用户交互软件的框架,而不是其他软件的框架。队列处理等目的。.NET Core 中的 async/await 似乎主要是为了处理围绕旧的 Windows 消息泵 UI 和 ASP.NET 每个请求一个执行流构建的应用程序而设计的,排除了一些其他架构。
让我详细说明一下。在这些更新之前,我们的大部分代码使用自定义线程池进行后端处理。
考虑到项目的性质(一半前端 Web API 服务和一半无头后端队列处理)以及优化成本的需要,我们努力将后端处理服务器上的 CPU 利用率保持在 97% 附近,并且我们正在利用并行处理也适用于一些前端操作。我们发现,对于任何系统,如果 CPU 利用率远高于 97%,您将无法监控服务器上正在发生的情况,也无法在无限循环不可避免地发生时检测到它们。我们的算法可以很好地实现大约这个利用率水平。我们定制线程池有几个原因:
ThreadPool,因为它不是 FIFO,不可避免地会导致一些长时间排队的操作挨饿,而有利于最近排队的操作,从而导致超时和其他难题。当 FIFO 处理引擎可以通过以更合理的 FIFO 顺序处理事物来避免超时时,对此进行补偿既浪费又乏味。PendingWorkItemCount几乎ThreadCount可以做到这一点,但在实践中,我没有无法提出一种对任意工作负载都可靠的算法)。因此,多年来,使用默认线程池以及除玩具代码之外的任何内容都无法实现持续 95% 以上的 …
c# multithreading asynchronous task-parallel-library async-await