C# Task.Run调用外部参数
时间:2022-07-26
本文章向大家介绍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);
}
}
}
运行结果:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- zabbix 监控项
- [PyQt Tutorial]4.使用Qt Designer
- [PyQt Tutorial]5.Signals & Slots(信号与槽)
- Docker数据共享与持久化
- [PyQt Tutorial]6.Layout Management(布局管理)
- Kubernetes入门
- [PyQt Tutorial]7.QDialog 类
- kubeadm快速部署kubernetes集群
- [PyQt Tutorial]8.QMessageBox
- Tomcat_01_简介
- Tomcat调优
- Tomcat_02_应用部署
- Tomcat_03_监控
- Kubernetes常用命令
- Oracle限制用户和客户端登陆