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调用外部参数相关推荐
- Task.Factory.StartNew 和 Task.Run 到底有什么区别?
前言 Task.Factory.StartNew 和 Task.Run 都可以创建 Task: Task.Factory.StartNew(() => { Console.WriteLine(& ...
- C# Task 循环任务_理解C#中的ValueTask
英文:devblogs.microsoft.com 译文:cnblogs.com/xiaoxiaotank/p/13206569.html 译者:xiaoxiaotank 前言 Task类是在.NET ...
- 5调用外部浏览器打开代码_浏览器事件循环
浏览器运行过程中会同时面对多种任务,用户交互事件(鼠标.键盘).网络请求.页面渲染等.而这些任务不能是无序的,必须有个先来后到,浏览器内部需要一套预定的逻辑来有序处理这些任务,因此浏览器事件循环诞生了 ...
- .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态
.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态?答案是:WaitingForActivation 新建一个.NET Core控制台程序,输入如下代码: ...
- Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?
前言 这不是和<Task.Factory.StartNew 和 Task.Run 到底有什么区别?>一样吗,怎么又写一篇? 起先我也是这么觉得的,但实际发现并非如此. 实现代码 查看这 2 ...
- Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?
咨询区 soleiljy 假设我们有一个涉及IO操作的方法 (读取数据库),这个方法支持以同步或者异步的方式执行. 同步方式 IOMethod() 异步方式 BeginIOMethod() EndI ...
- C语言task的用法,C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- C语言中task的用法,C# Task详解
C# Task详解 https://www.cnblogs.com/zhaoshujie/p/11082753.html 1.Task的优势 ThreadPool相比Thread来说具备了很多优势, ...
- android自定义task,Android Gradle 自定义Task 详解
一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...
最新文章
- demo17 clean-webpack-plugin (清除模式)
- Java 条件运算符
- UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信
- 线性结构 —— 栈与队列
- 提交表单上传照片预览
- 2016-4-18 ICMPv6协议[RFC2463]--报文详解
- Labview波形图 波形图表 XY图
- java 扫雷 实验报告_java实现简单扫雷
- 在浏览器连接linux服务器,使用浏览器连接Linux服务器
- 什么蓝牙耳机音质好?盘点四款HIFI音质蓝牙耳机排行榜
- Ruby与kiba的初学者etl教程
- matlab 查找字符串数组,Matlab之字符串数组查找
- 洛谷 P2916题解 【[USACO08NOV]Cheering up the Cow G】
- [zz]QuickTime电影(Movie)
- linux中的head 显示文件头部内容、tail 输出文件尾部内容
- php制作404,thinkphp制作404跳转页的简单实现方法
- Android ViewFlipper 用例
- SEO图片代码优化技巧汇总
- c++编程拼图小游戏
- 文件系统之软连接、硬链接的区别/文件删除与空间的联系/df和du的区别
热门文章
- Entity Framework Core 2.0 新特性
- 发布 ASP.NET Core 应用
- Docker4Dev #6 使用 Windows Container 运行.net应用
- 03.JavaScript对DOM操作
- Redis -- Hash(哈希) [3]
- 在anaconda中运行jupyter notebook,无法自动打开浏览器的解决方案,亲测100%有效
- HTML 元素内部添加预加载
- 【C语言简单说】七:自定义函数(2)
- linux重新做yum,Linux 系统 Centos 7.7 下重装yum
- creo管道设计教程_CREO/PROE产品设计教程之四芯花线建模,加深对关系式的认识...