在C#中保存任务的线程

时间:2014-11-22 20:28:52

标签: c# multithreading task

我正在用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);

一些基准:这些是操作时间,看看第一个如何占用更多的时间 11031个
180个
183个
179个
220

然后如果我暂时不做某事我会在输出中得到这个:
线程0xfbc已退出代码259(0x103) 线程0x1e2c已退出代码259(0x103) 线程0x1ed8已退出,代码为259(0x103) 线程0x1ee4已退出代码259(0x103) 还有一堆。然后基准返回类似的结果。

1 个答案:

答案 0 :(得分:3)

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

线程池将启动和停止线程,以便根据当前工作负载的要求执行任务。这就是你看到停止线程的原因。通常这不是问题。即使它必须启动4个线程,这将花费几毫秒而且不到11秒。对于程序的第一次运行,由于初始JIT编译和VM预热,它也会变慢。但即使这样也不会产生如此大的差异。

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

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