编辑
2025-09-24
C#
00

目录

摘要
正文
使用Task.ContinueWith方法

摘要

在C#中,根据应用程序的类型和需求,可以选择不同的方式来启动任务(Task)。这些启动方式主要通过System.Threading.Tasks.Task类或System.Threading.Tasks.Task<TResult>类来实现,适用于执行异步操作。

Task的启动方式一共有4种。

  • 任务t1通过调用 Task 类构造函数进行实例化,但仅在任务t2启动后调用其Start()方法启动。
  • 任务 t2 通过调用 TaskFactory.StartNew(Action, Object) 方法在单个方法调用中实例化和启动。
  • 任务 t3 通过调用 Run(Action) 方法在单个方法调用中实例化和启动。
  • 任务 t4 通过调用 RunSynchronously() 方法在主线程上同步执行。
  • 正文

    调用Start方法

    首先创建一个Task的实例,然后调用它的Start方法来启动任务。这种方式相比Task.RunTask.Factory.StartNew较少使用,因为它需要两步来启动任务,而上述方法只需要一步。

    C#
    private void btnRun_Click(object sender, EventArgs e) { var t = new Task(() => { this.BeginInvoke(() => { txtStatus.AppendText("Task RUN...\r\n"); }); Task.Delay(1000); }); t.Start(); Task.WaitAll(t);//等待所有任务结束,这是在UI是会卡住,需要把上面的Invoke改成BeginInvoke txtStatus.AppendText("RUN FINISH\r\n"); }

    image.png 静态方法Run

    Task.Run是启动异步任务最常见的方法之一。它接受一个ActionFunc<T>作为参数,并返回一个任务实例。这种方式适合于需要立即执行代码块的场景。

    C#
    private void btnRun_Click(object sender, EventArgs e) { Task.Run(() => { this.Invoke(new Action(() => { this.txtStatus.AppendText("FINISH"); })); }); }

    TaskFactory工厂

    Task.Factory.StartNew方法提供了更多的控制选项,比如任务的调度行为。它是一个较为灵活的启动任务的方式,但通常推荐使用Task.Run,因为Task.Run在默认情况下就能满足大多数需求。

    C#
    private void btnRun_Click(object sender, EventArgs e) { TaskFactory factory = new TaskFactory(); factory.StartNew(() => { this.Invoke(new Action(() => { txtStatus.AppendText("FINISH1\r\n"); })); Task.Delay(5000); }); }

    RunSynchronously同步启动

    C#
    private void btnRun_Click(object sender, EventArgs e) { var t = new Task(() => { this.txtStatus.AppendText("FINISH"); }); t.RunSynchronously();//同步方法 }

    使用Task.ContinueWith方法

    这不是直接启动新任务的方法,而是在一个任务完成后启动另一个任务。这种方式适用于任务之间有依赖关系的场景。

    C#
    Task initialTask = Task.Run(() => { // 初始异步执行的代码 Console.WriteLine("Initial task running..."); }); // initialTask完成后执行 Task continuationTask = initialTask.ContinueWith(previousTask => { // 在initialTask完成后执行的代码 Console.WriteLine("Continuation task running..."); });

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!