取消按时间(C#)取消排队任务



我有一个递归程序,称自己为新任务。

完成示例代码:

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属性。

相关内容

最新更新