C# 在C中为任务保留线程#

C# 在C中为任务保留线程#,c#,multithreading,task,C#,Multithreading,Task,我在用C语言申请。这个应用程序应该根据用户输入进行一些计算。 此计算相当繁重,因此我将其与任务并行,效果相当好,性能也有所提高。 然而,我的问题是,如果这些任务使用的线程不够快,它们就会被杀死。因此,如果用户在下一次输入之前等待大约30秒,线程就会被终止,需要重新启动 然而,线程的重新启动花费了相对较多的时间。是否可以保持这些线程处于打开状态,或者我不应该为此使用任务 如果您需要更多信息,请询问 编辑 int size = 10; Task[] htasks = new Tas

我在用C语言申请。这个应用程序应该根据用户输入进行一些计算。 此计算相当繁重,因此我将其与任务并行,效果相当好,性能也有所提高。
然而,我的问题是,如果这些任务使用的线程不够快,它们就会被杀死。因此,如果用户在下一次输入之前等待大约30秒,线程就会被终止,需要重新启动

然而,线程的重新启动花费了相对较多的时间。是否可以保持这些线程处于打开状态,或者我不应该为此使用任务

如果您需要更多信息,请询问

编辑

 int size = 10;
        Task[] htasks = new Task[size];
        Task[] vtasks = new Task[size];
        Semaphore[] vsemaphores = new Semaphore[size * 2 - 1];
        Semaphore[] hsemaphores = new Semaphore[size * 2 - 1];
        for (int i = 0; i < size * 2 - 1; i++)
        {
            vsemaphores[i] = new Semaphore(1, 2);
            hsemaphores[i] = new Semaphore(1, 2);
        }

        for (int i = 0; i < size; i++)
        {
            int local = i;
            htasks[local] = new Task(() => CalculateVSeams(ref hsemaphores, local, workingWidth, workingHeight));
            vtasks[local] = new Task(() => CalculateHSeams(ref vsemaphores, local, workingWidth, workingHeight));

        }

        for (int i = 0; i < size; i++)
        {
            htasks[i].Start();
            vtasks[i].Start();
        }
        Task.WaitAll(htasks);
        Task.WaitAll(vtasks);
int size=10;
Task[]htasks=新任务[大小];
任务[]vtasks=新任务[大小];
信号量[]vsemaphores=新信号量[size*2-1];
信号量[]hs信号量=新信号量[大小*2-1];
对于(int i=0;icalculateveSeams(参考hsemaphores,local,workingWidth,workingHeight));
vtasks[local]=新任务(()=>CalculateHeimes(参考向量、本地、工作宽度、工作高度));
}
对于(int i=0;i
一些基准:这些是操作的时间,看看第一个如何花费更多的时间。
11031
180
183
179
220

然后,如果我有一段时间不做某件事,我会在输出中得到以下信息:
线程0xfbc已退出,代码为259(0x103)。
线程0x1e2c已退出,代码为259(0x103)。
线程0x1ed8已退出,代码为259(0x103)。
线程0x1ee4已退出,代码为259(0x103)。

还有一堆。然后基准测试返回类似的结果。

您的任务正在使用当前环境的默认计划程序。(最有可能是C#ThreadPool)。您可以通过
Task.Factory.scheduler
属性获取此计划程序

线程池将根据当前工作负载的要求启动和停止线程以执行任务。这就是为什么会看到停止的线程。通常情况下,这不是什么问题。即使它必须启动4个线程,这也需要几毫秒,而不是11秒。对于程序的第一次运行,由于初始JIT编译和VM预热,它也会变慢。但即使这样也不会有太大的区别

也许您的代码中还有其他问题?或者,您是否意外地将用户空闲时间包含在第一次测量中


如果您对调度器的行为不满意,可以通过创建
TaskFactory
并将其传递给另一个调度器来创建使用另一个调度器的任务,并从中创建任务。您需要为此实现一个自定义调度程序。您可以创建一个具有固定线程数的线程,然后以循环方式在其上分配所有新任务。但通常情况下,C#线程池应该非常好。

您的任务使用的是当前环境的默认调度程序。(最有可能是C#ThreadPool)。您可以通过
Task.Factory.scheduler
属性获取此计划程序

线程池将根据当前工作负载的要求启动和停止线程以执行任务。这就是为什么会看到停止的线程。通常情况下,这不是什么问题。即使它必须启动4个线程,这也需要几毫秒,而不是11秒。对于程序的第一次运行,由于初始JIT编译和VM预热,它也会变慢。但即使这样也不会有太大的区别

也许您的代码中还有其他问题?或者,您是否意外地将用户空闲时间包含在第一次测量中


如果您对调度器的行为不满意,可以通过创建
TaskFactory
并将其传递给另一个调度器来创建使用另一个调度器的任务,并从中创建任务。您需要为此实现一个自定义调度程序。您可以创建一个具有固定线程数的线程,然后以循环方式在其上分配所有新任务。但通常情况下,C#线程池应该非常好。

您的任务使用的是当前环境的默认调度程序。(最有可能是C#ThreadPool)。您可以通过
Task.Factory.scheduler
属性获取此计划程序

线程池将根据当前工作负载的要求启动和停止线程以执行任务。这就是为什么会看到停止的线程。通常情况下,这不是什么问题。即使它必须启动4个线程,这也需要几毫秒,而不是11秒。对于程序的第一次运行,由于初始JIT编译和VM预热,它也会变慢。但即使这样也不会有太大的区别

也许您的代码中还有其他问题?或者,您是否意外地将用户空闲时间包含在第一次测量中


如果您对调度器的行为不满意,可以通过创建
TaskFactory
并将其传递给另一个调度器来创建使用另一个调度器的任务,并从中创建任务。您需要为此实现一个自定义调度程序。您可以创建一个具有固定线程数的线程,然后以循环方式在其上分配所有新任务。但通常情况下,C#线程池应该非常好。

您的任务使用的是当前环境的默认调度程序。(最有可能是C#ThreadPool)。您可以通过
Task.Factory.scheduler
属性获取此计划程序

threa