C# Task 循环任务_C# Task.Run调用外部参数
生活随笔
收集整理的這篇文章主要介紹了
C# Task 循环任务_C# Task.Run调用外部参数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先講一下:
c# Task啟動帶參數和返回值的方法:
Task啟動帶參數
Task.Run(() => test("123"));
public void Test(string s){
...todo..
}
Task啟動帶參數和返回值的方法
var s = Task.Run(() => isTest("ss"));
var t = s.Result;
private bool isTest(string isno) {
return true;
}
?然后開始我們的實例:即通過for循環開啟十個task,并分別在task任務中輸出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); } } }運行后發現報錯了:索引超出了數組界限。i會一直是10
原因解析:
Task.Run是在新的線程中異步執行的,在 for 循環中 Task 并不會立即執行,“i會一直是10”說明 for 循環結束后,Task 才開始執行,這時 i 的值正好是 10 。
解決辦法:
這說明 i 的值沒有被捕獲到 Task 的執行上下文中,也就是說 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); } } }運行結果:
------------------------------------------------------------------------
如果這篇文章對你有幫助,就請多多點擊在看,讓更多朋友看到,需要進C#交流群群請加z438679770,備注進群
總結
以上是生活随笔為你收集整理的C# Task 循环任务_C# Task.Run调用外部参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么往U盘里面拷贝文件
- 下一篇: c#事件的发布-订阅模型_微信灰度测试订