使用c# 设计一个可以处理任务依赖的,任务系统
时间: 2023-12-10 08:39:26 浏览: 40
针对任务依赖的任务系统可以使用有向无环图(DAG)来表示,并且可以使用拓扑排序来解决任务之间的依赖关系。
以下是一个简单的C#代码示例,用于实现基于DAG的任务系统:
```csharp
using System;
using System.Collections.Generic;
class Task
{
public string Name { get; set; }
public List<Task> Dependencies { get; set; }
public Action Action { get; set; }
public bool IsCompleted { get; set; }
public Task(string name, Action action)
{
Name = name;
Action = action;
Dependencies = new List<Task>();
IsCompleted = false;
}
public void AddDependency(Task dependency)
{
Dependencies.Add(dependency);
}
public void Execute()
{
Action();
IsCompleted = true;
}
}
class TaskSystem
{
private List<Task> tasks;
public TaskSystem()
{
tasks = new List<Task>();
}
public void AddTask(Task task)
{
tasks.Add(task);
}
public void Execute()
{
List<Task> readyTasks = new List<Task>();
// 将没有依赖任务的任务添加到 readyTasks 列表中
foreach (Task task in tasks)
{
if (task.Dependencies.Count == 0)
{
readyTasks.Add(task);
}
}
// 不断执行 readyTasks 列表中的任务,并将其从任务列表中删除
while (readyTasks.Count > 0)
{
Task task = readyTasks[0];
readyTasks.RemoveAt(0);
task.Execute();
// 将所有依赖于该任务的任务的依赖列表中移除该任务
foreach (Task dependent in tasks)
{
dependent.Dependencies.Remove(task);
}
// 将没有依赖任务的任务添加到 readyTasks 列表中
foreach (Task dependent in tasks)
{
if (dependent.Dependencies.Count == 0 && !dependent.IsCompleted)
{
readyTasks.Add(dependent);
}
}
}
}
}
// 示例用法
Task taskA = new Task("Task A", () => Console.WriteLine("Task A is completed."));
Task taskB = new Task("Task B", () => Console.WriteLine("Task B is completed."));
Task taskC = new Task("Task C", () => Console.WriteLine("Task C is completed."));
Task taskD = new Task("Task D", () => Console.WriteLine("Task D is completed."));
taskB.AddDependency(taskA);
taskC.AddDependency(taskB);
taskD.AddDependency(taskA);
taskD.AddDependency(taskC);
TaskSystem taskSystem = new TaskSystem();
taskSystem.AddTask(taskA);
taskSystem.AddTask(taskB);
taskSystem.AddTask(taskC);
taskSystem.AddTask(taskD);
taskSystem.Execute();
```
该代码示例中,我们定义了一个 Task 类来表示每个任务,其中包含任务名称、依赖任务列表、任务动作和是否已完成等属性。我们还定义了一个 TaskSystem 类作为任务系统,负责管理任务列表和执行任务。
在 Execute 方法中,我们首先将没有依赖任务的任务添加到 readyTasks 列表中。然后,我们不断从 readyTasks 列表中取出任务并执行,同时将所有依赖于该任务的任务的依赖列表中移除该任务。最后,我们再将没有依赖任务的任务添加到 readyTasks 列表中,直到任务列表中没有任务时停止执行。
在示例用法中,我们定义了四个任务,并设置它们之间的依赖关系。然后,我们将这些任务添加到任务系统中并执行。该代码输出的结果是:
```
Task A is completed.
Task B is completed.
Task C is completed.
Task D is completed.
```
这表明任务系统成功地按照任务依赖关系有序地执行了这些任务。