怎樣用C# taskscheduler管理多個(gè)任務(wù)

c#
小樊
84
2024-10-16 19:21:23
欄目: 編程語言

在C#中,使用TaskScheduler類可以方便地管理和調(diào)度多個(gè)任務(wù)。以下是一個(gè)簡(jiǎn)單的示例,展示了如何使用TaskScheduler來創(chuàng)建、調(diào)度和執(zhí)行多個(gè)任務(wù):

  1. 首先,確保已經(jīng)安裝了System.Threading.Tasks命名空間。如果沒有安裝,可以通過NuGet包管理器進(jìn)行安裝。

  2. 創(chuàng)建一個(gè)繼承自TaskScheduler的類,以便可以添加自定義邏輯。在這個(gè)示例中,我們將創(chuàng)建一個(gè)簡(jiǎn)單的MyTaskScheduler類。

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

public class MyTaskScheduler : TaskScheduler
{
    private readonly List<Task> _tasks = new List<Task>();

    protected override IEnumerable<Task> GetScheduledTasks()
    {
        return _tasks;
    }

    protected override void QueueTask(Task task)
    {
        _tasks.Add(task);
        base.QueueTask(task);
    }

    public void Start()
    {
        foreach (var task in _tasks)
        {
            Task.Run(() => task.Run());
        }
    }
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)MyTaskScheduler類,它繼承自TaskScheduler。我們添加了一個(gè)_tasks列表來存儲(chǔ)調(diào)度任務(wù),并重寫了GetScheduledTasksQueueTask方法以便訪問這些任務(wù)。我們還添加了一個(gè)Start方法,用于啟動(dòng)所有調(diào)度任務(wù)。

  1. 創(chuàng)建一個(gè)要執(zhí)行的任務(wù)類。在這個(gè)示例中,我們將創(chuàng)建一個(gè)簡(jiǎn)單的MyTask類,它實(shí)現(xiàn)IRunnable接口。
public interface IRunnable
{
    void Run();
}

public class MyTask : IRunnable
{
    private readonly string _name;

    public MyTask(string name)
    {
        _name = name;
    }

    public void Run()
    {
        Console.WriteLine($"Starting task: {_name}");
        Thread.Sleep(1000); // 模擬任務(wù)執(zhí)行時(shí)間
        Console.WriteLine($"Finished task: {_name}");
    }
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)MyTask類,它實(shí)現(xiàn)IRunnable接口。Run方法用于執(zhí)行任務(wù)邏輯。

  1. 使用MyTaskScheduler類調(diào)度和執(zhí)行多個(gè)任務(wù)。
class Program
{
    static void Main(string[] args)
    {
        var taskScheduler = new MyTaskScheduler();

        var tasks = new List<IRunnable>
        {
            new MyTask("Task 1"),
            new MyTask("Task 2"),
            new MyTask("Task 3")
        };

        foreach (var task in tasks)
        {
            var t = Task.Factory.StartNew(task, CancellationToken.None, TaskCreationOptions.None, taskScheduler);
            t.ContinueWith(_ => Console.WriteLine($"Task completed: {t.Result._name}"));
        }

        taskScheduler.Start();
    }
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)MyTaskScheduler實(shí)例,并創(chuàng)建了一個(gè)IRunnable任務(wù)列表。然后,我們遍歷任務(wù)列表,為每個(gè)任務(wù)創(chuàng)建一個(gè)新的Task實(shí)例,并將其添加到MyTaskScheduler中。最后,我們調(diào)用taskScheduler.Start()方法來啟動(dòng)所有調(diào)度任務(wù)。

這個(gè)示例展示了如何使用TaskScheduler類來管理和調(diào)度多個(gè)任務(wù)。你可以根據(jù)需要擴(kuò)展這個(gè)示例,以適應(yīng)你的具體需求。

0