ป้ายกำกับ: Asynchronous

C#: แบ่งงานช่วยกันรุมให้เสร็จโดย TasksC#: แบ่งงานช่วยกันรุมให้เสร็จโดย Tasks

cpu รุ่นใหม่ ๆ สามารถทำงานได้พร้อม ๆ กันหลาย ๆ งานในเวลาเดียวกัน ทำไมจะไม่เขียนโปรแกรมให้ทำงานพร้อม ๆ กันจะได้เสร็จไว้ ๆ ละ

ตัวอย่าง c# Console App

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks; namespace ConsoleApp1
{ internal class Program { private static void Main (string[] args) { Dictionary<string, string> months = new Dictionary<string, string> () { {"01","January"}, {"02","February"}, {"03","March"}, {"04","April"}, {"05","May"}, {"06","June"}, {"07","July"}, {"08","August"}, {"09","September"}, {"10","October"}, {"11","November"}, {"12","December"}, }; var reultsts = new List<List<string>> () ; Console.WriteLine ("Start Main") ; reultsts = RunAsync (months) .Result; Console.WriteLine ("End Main get reultsts " + reultsts.Count () + " items") ; Console.ReadKey () ; } public static async Task<List<List<string>>> RunAsync (Dictionary<string, string> months) { var tasks = new List<Task> () ; var reultsts = new List<List<string>> () ; Console.WriteLine ("Start RunAsync") ; foreach (KeyValuePair<string, string> item in months) { tasks.Add (Task.Run ( () => { reultsts.Add (TaskRun (item.Key, item.Value) .Result) ; })) ; } Task t = Task.WhenAll (tasks) ; try { t.Wait () ; } catch { } Console.WriteLine ("End RunAsync") ; return reultsts; } public static async Task<List<string>> TaskRun (string key, string value) { Random random = new Random () ; string message; int sleep; var results = new List<string> () ; for (int i = 0; i < 2; i++) { sleep = random.Next (1, 10) * 1000; System.Threading.Thread.Sleep (sleep) ; message = "TaskRun month " + key + " " + i + " " + sleep; results.Add (message) ; Console.WriteLine ("\t" + message) ; } return results; } }
}

จะเห็นว่าไม่ได้ทำงานตามลำดับเดือน แถมบางเดือนจะทำครั้งที่ 1 และครั้งที่ 2 ห่างกันมากด้วยซ้ำไปเพราะว่าการจำลองการทำงานด้วย sleep ที่สุ่มไว้ได้เวลาต่างกันมาก อันไหนทำเสร็จแล้วมันก็จะไปหยิบงานอื่นมาทำก่อนโดยไม่ต้องรอให้งานเสร็จตามลำดับ


อ่านเพิ่มเติม