我有一个递归程序,称自己为新任务。
完成示例代码:
using System;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
public class Class0
{
const int initialTasks = 1;
static void Main()
{
Class1 myClass1 = new Class1();
myClass1.Go(initialTasks);
Console.ReadLine();
}
}
public class Class1
{
const int childrenTasks = 100;
const int fibonacciTarget = 1234567;
double taskCount = 0;
public void Go(int tasks)
{
for (int index = tasks; index > 0; index--)
{
double taskID = GetID();
Console.WriteLine("Enqueue: {0}", taskID);
Task mainTask = new Task(() => MainTask(taskID));
mainTask.Start();
}
}
private void MainTask(double taskID)
{
FibonacciToTarget(fibonacciTarget);
Go(childrenTasks);
Console.WriteLine("DONE : {0}", taskID);
}
//cpu bound task
private static void FibonacciToTarget(int target)
{
int a = 1;
int b = 1;
int x;
loop:
if (b > target) { return; }
x = a + b;
a = b;
b = x;
goto loop;
}
private double GetID()
{
lock (this)
{
taskCount++;
return taskCount;
}
}
}
}
这持续了一段时间,但最终会产生太多的任务。
如果花费时间超过1分钟才能完成/开始?
有没有办法使排队的任务死亡?我已经阅读了以下内容:按时间取消任务它似乎依靠已经运行的任务,但是我的程序是CPU绑定,因此任务在被启用后甚至可能不会开始运行一分钟。
您的代码在短时间内消耗CPU时间后正在制作100个其他任务。这会陷入积极的反馈(动作1导致行动2,导致行动1)。如果您不关闭程序开始吃交换内存之前,您将使计算机无法使用。
如果花费时间超过1分钟才能完成/开始?
有没有办法使排队的任务死亡?
最简单的方法是使用您阅读的问题之一中提到的CancellationTokenSource
类。但是,如果我理解您的正确理解,那将使该程序在一分钟后自杀。
这是一种计算通过虚拟道路网络的旅行成本的方法。每次在整个网络上进行计算时,都会增加该路线的成本,从而订购路线成本。
您想要实现的是用于计算旅行推销员问题解决方案的算法。递归做到这一点不是一个好主意,因为解决复杂性是天空高(n-1)!
使用动态编程(如果您真的想获取多线程,则使用Dynamic编程(以及与Worker线程并行化的数组访问)来解决此问题。搜索解决该算法的最佳算法。而且,如果您确实想要一种快速结束程序的方法,请共享一个CancellationTokenSource
类,将所有工作线程共享,并且在每个计算周期之前,他们都会检查IsCancellationRequested
属性。