gpt4 book ai didi

c# - 保证并行线程/任务/任何东西的立即启动

转载 作者:太空宇宙 更新时间:2023-11-03 12:46:26 26 4
gpt4 key购买 nike

我将使用“Process”来指代将要并行发生的工作,使用“enqueue”来指代将用于启动该进程的任何进程(无论是 Task.Run、ThreadPool。 QUWI,new Thread() ... 随便什么)。

我们有一个性能敏感的程序,它产生多个并行进程来收集数据。

我们在生成方面遇到了问题,进程没有立即开始。

具体来说,如果我们准备一个进程,启动一个计时器,将进程排入队列,并将计时器作为进程中的第一个 Action 进行检查......然后我们会看到时间延迟偶尔会延长到 100 毫秒甚至 1000 毫秒.

鉴于进程本身应该只运行 3-10 秒,因此在进程排队和激活之间有 2 秒的延迟是一个主要问题。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

目前我们的实现开始使用 TP.QUWI,然后我们转向使用 Task.Run。我们的初步调查将我们引向 Threadpool 使用的 Thread-Creation-Strategy 和 ThreadPool.SetMinThreads(),因此我们从这个角度出发,看看是否能完全解决问题。

但是,如果我们的目标是让进程在入队后立即启动,我们是否应该考虑另一种变化/方法?

最佳答案

Taken from here (我强烈建议您仔细阅读):

似乎你想要的东西可以通过覆盖默认任务调度程序来实现......吓人......

You can't assume that all parallel tasks will immediately run. Depending on the current work load and system configuration, tasks might be scheduled to run one after another, or they might run at the same time. For more information about how tasks are scheduled, see the section, "The Default Task Scheduler," later in this chapter.

使用自定义计划创建任务

您可以通过覆盖任务工厂方法使用的默认任务调度程序,自定义 .NET 中任务调度和运行方式的详细信息。例如,您可以提供自定义任务计划程序作为 TaskFactory.StartNew 方法的重载版本之一的参数。

在某些情况下,您可能希望覆盖默认调度程序。最常见的情况发生在您希望您的任务在特定线程上下文中运行时... 其他情况发生在默认任务调度程序的负载平衡试探法不适用于您的应用程序时。有关详细信息,请参阅本章后面的“线程注入(inject)”部分。

除非您另外指定,否则任何新任务都将使用当前任务调度程序...

您可以实现自己的任务调度程序类。有关详细信息,请参阅本章后面的“编写自定义任务计划程序”部分。

线程注入(inject)

.NET 线程池自动管理池中工作线程的数量...

阅读 this SO post "replacing the task scheduler in c sharp with a custom built one "

关于c# - 保证并行线程/任务/任何东西的立即启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37164570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com