C# Task 循环任务_C# Task.Run调用外部参数

本文探讨了在C#中使用Task.Run启动带参数的循环任务时出现的索引超出数组界限错误。原因是Task是异步执行的,for循环结束后的i值被用于所有任务,导致错误。解决办法是使用中间变量确保每个Task捕获到正确的i值。通过这个解决方案,任务可以正常执行并输出预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先讲一下:

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

24fbf895c6ef24453ededd389523626a.png

原因解析:

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);        }            }    }

运行结果:

333ce5ea6553f0549b3a491525a6ed36.png

------------------------------------------------------------------------

如果这篇文章对你有帮助,就请多多点击,让更多朋友看到,需要进C#交流群群请加z438679770,备注进群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值