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(() =>writeline输出数值变量
{
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,备注进
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论