C#使用Task實現並行編程

故事背景

透著紗的窗外的陽光, 又是一個星期一.

慢慢來

一看時間, 還早, 那麼蹦躂起來

  • 穿衣
  • 刷牙
  • 洗臉

用代碼來說的話, 應該是這樣:

// Program.cs
using System;
using System.Diagnostics;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("早起三件事開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Dress();
            BrushTeeth();
            WashFace();
            sw.Stop();
            Console.WriteLine($"...早起三件事完成, 總耗時 {sw.Elapsed.Seconds} 秒");
            Console.ReadKey();
        }

        /// <summary>
        /// 穿衣
        /// </summary>
        static void Dress()
        {
            Console.WriteLine($"穿衣開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Thread.Sleep(timeout: TimeSpan.FromSeconds(value: 1));
            sw.Stop();
            Console.WriteLine($"...穿衣完成, 耗時 {sw.Elapsed.Seconds} 秒");
        }

        /// <summary>
        /// 刷牙
        /// </summary>
        static void BrushTeeth()
        {
            Console.WriteLine($"刷牙開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Thread.Sleep(timeout: TimeSpan.FromSeconds(value: 3));
            sw.Stop();
            Console.WriteLine($"...刷牙完成, 耗時 {sw.Elapsed.Seconds} 秒");
        }

        /// <summary>
        /// 洗臉
        /// </summary>
        static void WashFace()
        {
            Console.WriteLine($"洗臉開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Thread.Sleep(timeout: TimeSpan.FromSeconds(value: 5));
            sw.Stop();
            Console.WriteLine($"...系列完成, 耗時 {sw.Elapsed.Seconds} 秒");
        }
    }
}

運行之後, 等待一會, 會看到如下輸出:

早起三件事開始…
穿衣開始…
…穿衣完成, 耗時 1 秒
刷牙開始…
…刷牙完成, 耗時 3 秒
洗臉開始…
…系列完成, 耗時 5 秒
…早起三件事完成, 總耗時 9 秒

一件一件事慢慢來, 總耗時 9 秒…

趕時間

一看時間, 哎呦我去, 快遲到瞭, 穿衣 & 刷牙 & 洗臉一起來吧…別問我現實中怎麼實現的

總而言之代碼是這樣滴:

// Program.cs
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("早起三件事開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Task dressTask = Task.Factory.StartNew(action: Dress);
            Task brushTeethTask = Task.Factory.StartNew(action: BrushTeeth);
            Task washFaceTask = Task.Factory.StartNew(action: WashFace);
            Task.WaitAll(dressTask, brushTeethTask, washFaceTask);
            sw.Stop();
            Console.WriteLine($"...早起三件事完成, 總耗時 {sw.Elapsed.Seconds} 秒");
            Console.ReadKey();
        }

        /// <summary>
        /// 穿衣
        /// </summary>
        static void Dress()
        {
            Console.WriteLine($"穿衣開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Thread.Sleep(timeout: TimeSpan.FromSeconds(value: 1));
            sw.Stop();
            Console.WriteLine($"...穿衣完成, 耗時 {sw.Elapsed.Seconds} 秒");
        }

        /// <summary>
        /// 刷牙
        /// </summary>
        static void BrushTeeth()
        {
            Console.WriteLine($"刷牙開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Thread.Sleep(timeout: TimeSpan.FromSeconds(value: 3));
            sw.Stop();
            Console.WriteLine($"...刷牙完成, 耗時 {sw.Elapsed.Seconds} 秒");
        }

        /// <summary>
        /// 洗臉
        /// </summary>
        static void WashFace()
        {
            Console.WriteLine($"洗臉開始...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Thread.Sleep(timeout: TimeSpan.FromSeconds(value: 5));
            sw.Stop();
            Console.WriteLine($"...系列完成, 耗時 {sw.Elapsed.Seconds} 秒");
        }
    }
}

啟動運行之後, 等待一會, 你應該會看到如下輸出:

早起三件事開始…
刷牙開始…
洗臉開始…
穿衣開始…
…穿衣完成, 耗時 1 秒
…刷牙完成, 耗時 3 秒
…系列完成, 耗時 5 秒
…早起三件事完成, 總耗時 5 秒

可以看到, 幾件事一起幹瞭, 總耗時隻用瞭 5 秒.

總結一下

幾件事一起幹(並行), 比一件一件事慢慢來

  • 要省時間, 但是要多寫點代碼, 更耗體力.
  • 可以使用 Task 來輕松實現並行操作.

以上就是這篇文章的全部內容瞭,希望本文的內容對大傢的學習或者工作具有一定的參考學習價值,謝謝大傢對WalkonNet的支持。如果你想瞭解更多相關內容請查看下面相關鏈接

推薦閱讀: