首先讲一下:

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调用外部参数相关推荐

  1. Task.Factory.StartNew 和 Task.Run 到底有什么区别?

    前言 Task.Factory.StartNew 和 Task.Run 都可以创建 Task: Task.Factory.StartNew(() => { Console.WriteLine(& ...

  2. C# Task 循环任务_理解C#中的ValueTask

    英文:devblogs.microsoft.com 译文:cnblogs.com/xiaoxiaotank/p/13206569.html 译者:xiaoxiaotank 前言 Task类是在.NET ...

  3. 5调用外部浏览器打开代码_浏览器事件循环

    浏览器运行过程中会同时面对多种任务,用户交互事件(鼠标.键盘).网络请求.页面渲染等.而这些任务不能是无序的,必须有个先来后到,浏览器内部需要一套预定的逻辑来有序处理这些任务,因此浏览器事件循环诞生了 ...

  4. .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态

    .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态?答案是:WaitingForActivation 新建一个.NET Core控制台程序,输入如下代码: ...

  5. Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?

    前言 这不是和<Task.Factory.StartNew 和 Task.Run 到底有什么区别?>一样吗,怎么又写一篇? 起先我也是这么觉得的,但实际发现并非如此. 实现代码 查看这 2 ...

  6. Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?

    咨询区 soleiljy 假设我们有一个涉及IO操作的方法 (读取数据库),这个方法支持以同步或者异步的方式执行. 同步方式 IOMethod() 异步方式 BeginIOMethod()  EndI ...

  7. C语言task的用法,C# Task 用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

  8. C语言中task的用法,C# Task详解

    C# Task详解  https://www.cnblogs.com/zhaoshujie/p/11082753.html 1.Task的优势 ThreadPool相比Thread来说具备了很多优势, ...

  9. android自定义task,Android Gradle 自定义Task 详解

    一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...

最新文章

  1. demo17 clean-webpack-plugin (清除模式)
  2. Java 条件运算符
  3. UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信
  4. 线性结构 —— 栈与队列
  5. 提交表单上传照片预览
  6. 2016-4-18 ICMPv6协议[RFC2463]--报文详解
  7. Labview波形图 波形图表 XY图
  8. java 扫雷 实验报告_java实现简单扫雷
  9. 在浏览器连接linux服务器,使用浏览器连接Linux服务器
  10. 什么蓝牙耳机音质好?盘点四款HIFI音质蓝牙耳机排行榜
  11. Ruby与kiba的初学者etl教程
  12. matlab 查找字符串数组,Matlab之字符串数组查找
  13. 洛谷 P2916题解 【[USACO08NOV]Cheering up the Cow G】
  14. [zz]QuickTime电影(Movie)
  15. linux中的head 显示文件头部内容、tail 输出文件尾部内容
  16. php制作404,thinkphp制作404跳转页的简单实现方法
  17. Android ViewFlipper 用例
  18. SEO图片代码优化技巧汇总
  19. c++编程拼图小游戏
  20. 文件系统之软连接、硬链接的区别/文件删除与空间的联系/df和du的区别

热门文章

  1. Entity Framework Core 2.0 新特性
  2. 发布 ASP.NET Core 应用
  3. Docker4Dev #6 使用 Windows Container 运行.net应用
  4. 03.JavaScript对DOM操作
  5. Redis -- Hash(哈希) [3]
  6. 在anaconda中运行jupyter notebook,无法自动打开浏览器的解决方案,亲测100%有效
  7. HTML 元素内部添加预加载
  8. 【C语言简单说】七:自定义函数(2)
  9. linux重新做yum,Linux 系统 Centos 7.7 下重装yum
  10. creo管道设计教程_CREO/PROE产品设计教程之四芯花线建模,加深对关系式的认识...