c#中任务Task

1.通过任务开启线程

1.1 创建Task对象

      首先创建任务对象,任务对象调用Start()方法开启任务线程。

class Program
{
    static void DownLoad(object str)
    {
        Console.WriteLine("DownLoad Begin ID = " + Thread.CurrentThread.ManagedThreadId + " " + str);
        Thread.Sleep(1000);
        Console.WriteLine("DownLoad End");
    }
    static void Main(string[] args)
    {
        //创建任务
        Task task = new Task(DownLoad, "人民日报");
        //启动任务
        task.Start();
        Console.WriteLine("Main");   
        Console.ReadKey();
    }
}

运行结果

1.2 任务工厂TaskFactory

      首先创建任务工厂,然后调用StartNew()方法开启任务线程。

class Program
{
    static void DownLoad(object str)
    {
        Console.WriteLine("DownLoad Begin ID = " + Thread.CurrentThread.ManagedThreadId + " " + str);
        Thread.Sleep(1000);
        Console.WriteLine("DownLoad End");
    }
    static void Main(string[] args)
    {
        //创建任务工厂
        TaskFactory taskFactory = new TaskFactory();
        //开始新的任务
        taskFactory.StartNew(DownLoad, "纽约时报");
        Console.WriteLine("Main");
        Console.ReadKey();
    }
}

运行结果

2.连续任务

     如果一个任务的执行依赖于另一个任务,即任务的执行有先后顺序。此时,我们可以使用连续任务。

    task.ContinueWith(ReadNews)表示一个任务task结束后,才开始执行另一个任务。

class Program
{
    static void DownLoad(object str)
    {
        Console.WriteLine("DownLoad Begin ID = " + Thread.CurrentThread.ManagedThreadId + " " + str);
        Thread.Sleep(1000);
        Console.WriteLine("DownLoad End");
    }
    static void ReadNews(Task obj)
    {
        Thread.Sleep(1000);
        Console.WriteLine("Read News");
    }
    static void Main(string[] args)
    {
        Task task = new Task(DownLoad, "人民日报");
        Task task2 = task.ContinueWith(ReadNews);
        task.Start();
        Console.ReadKey();
    }
}

执行结果

3.任务的层次结构

   在一个任务中可以启动子任务,两个任务异步执行。默认情况下,子任务(即由外部任务创建的内部任务)将独立于其父任务执行。使用TaskCreationOptions.AttachedToParent显式指定将任务附加到任务层次结构中的某个父级。

   如果父任务执行完了但是子任务没有执行完,则父任务的状态会被设置为WaitingForChildrenToComplete,只有子任务也执行完了,父任务的状态才会变成RunToCompletion。

class Program
{
    static void DownLoad(object str)
    {
        Console.WriteLine("Parent Begin ID = " + Thread.CurrentThread.ManagedThreadId + " " + str);

        Task child = new Task(ChildWork, TaskCreationOptions.AttachedToParent);
        child.Start();
        Thread.Sleep(1000);
        Console.WriteLine("Parent End");
    }

    static void ChildWork()
    {
        Console.WriteLine("Child begin");
        Thread.Sleep(5000);
        Console.WriteLine("Child end");
    }

    static void Main(string[] args)
    {
        Task task = new Task(DownLoad, "人民日报");
        task.Start();
        Thread.Sleep(2000);
        Console.WriteLine(task.Status);
        Thread.Sleep(4000);
        Console.WriteLine(task.Status);
        Console.ReadKey();
    }
}

  运行结果:

  

4.任务的执行结果

    使用Task的泛型版本,可以返回任务的执行结果。

    下面例子中的TaskWithResult的输入为object类型,返回一个元组Tuple<int, int>。

     定义调用TaskWithResult的任务时,使用泛型类Task<Tuple<int, int>>,泛型的参数定义了返回类型。通过构造函数,传递TaskWithResult,构造函数的第二个参数定义了TaskWithResult的输入值。

     任务完成后,通过Result属性获取任务的结果。

class Program
{
    static Tuple<int, int> TaskWithResult(object obj)
    {
        Tuple<int, int> div = (Tuple<int, int>)obj;
        Thread.Sleep(1000);
        return Tuple.Create<int, int>(div.Item1 + div.Item2, div.Item1 - div.Item2);
    }
    static void Main(string[] args)
    {
        var task = new Task<Tuple<int, int>>(TaskWithResult, Tuple.Create<int, int>(8, 3));            
        task.Start();
        Console.WriteLine(task.Result);
        task.Wait();
        Console.WriteLine("Result: {0} {1}", task.Result.Item1, task.Result.Item2);
        Console.ReadLine();
    }
}

    执行结果:

  

### C# 中实现 Task 延时启动的方法 在 C# 中,可以利用 `System.Threading.Tasks` 命名空间中的 `Task.Delay()` 方法来创建延时效果。此方法返回一个表示延迟操作的任务对象,在指定的时间间隔后完成[^1]。 对于希望延时启动另一个任务的情况,可以在执行目标任务前先调用 `await Task.Delay(...)`. 下面给出一段示范代码: ```csharp using System; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { Console.WriteLine("准备启动带延时的任务..."); // 创建并立即启动带有前置延时的任务 var delayedTask = StartDelayedTask(2000, "这是被延时启动的任务"); // 执行其他工作... Console.WriteLine("主程序继续运行..."); // 等待延时任务完成 await delayedTask; Console.WriteLine("延时任务已完成"); Console.ReadLine(); } /// <summary> /// 启动一个具有预设时间延迟的任务. /// </summary> /// <param name="delayMilliseconds">要等待多少毫秒才开始实际的工作.</param> /// <param name="message">当任务真正开始时打印的消息.</param> /// <returns>代表整个过程(包括延时期间)的一个任务实例</returns> private static async Task StartDelayedTask(int delayMilliseconds, string message) { Console.WriteLine($"即将延时 {delayMilliseconds} 毫秒后再执行任务."); await Task.Delay(delayMilliseconds); Console.WriteLine(message); } } ``` 这段代码展示了如何定义一个新的异步函数 `StartDelayedTask`, 它接收两个参数:一个是用于设置延时时长的整数值;另一个是要显示的信息字符串。通过这种方式,能够灵活控制任何给定任务何时开始执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值