Task啟動(dòng)帶參數
Task啟動(dòng)帶參數和返回值的方法
然后開(kāi)始我們的實(shí)例:即通過(guò)for循環(huán)開(kāi)啟十個(gè)task,并分別在task任務(wù)中輸出1~10.
using System;using System.Threading.Tasks;
namespace ConsoleApp1{ class Program { static void Main(string[] args) { Task[] tasks = new Task[10]; int[] numbers = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < tasks.Length; i++) { tasks[i] = Task.Run(() => { Test(numbers[i]); }); } Console.ReadLine(); }
static public void Test(int s) { Console.WriteLine("Number:{0}", s);
} } }運行后發(fā)現報錯了:索引超出了數組界限。i會(huì )一直是10
原因解析:
Task.Run是在新的線(xiàn)程中異步執行的,在 for 循環(huán)中 Task 并不會(huì )立即執行,“i會(huì )一直是10”說(shuō)明 for 循環(huán)結束后,Task 才開(kāi)始執行,這時(shí) i 的值正好是 10 。
解決辦法:
這說(shuō)明 i 的值沒(méi)有被捕獲到 Task 的執行上下文中,也就是說(shuō) i 變量的值不在捕獲范圍內,要想讓 i 被捕獲,需要引入中間變量,下面的代碼就可以正常執行
using System;using System.Threading.Tasks;
namespace ConsoleApp1{ class Program { static void Main(string[] args) { Task[] tasks = new Task[10]; int[] numbers = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < tasks.Length; i++) { var j = i; tasks[i] = Task.Run(() => { Test(numbers[j]); }); } Console.ReadLine(); }
static public void Test(int s) { Console.WriteLine("Number:{0}", s);
} } }運行結果:
------------------------------------------------------------------------
如果這篇文章對你有幫助,就請多多點(diǎn)擊在看,讓更多朋友看到,需要進(jìn)C#交流群群請加z438679770,備注進(jìn)群
聯(lián)系客服