c# for循环中创建线程执行问题

作者:随风去远方 时间:2021-09-15 20:43:23 

先执行以一个简单的示例:


static void Main(string[] args) {
           List<int> taskConsumes = new List<int>() { 1,2,3,4,5};
           for (int i = 0; i < taskConsumes.Count; i++)
           {
               new Task(() => {
                   TaskMethod(taskConsumes[i]);
               }).Start();
           }
           Console.ReadLine();
       }

public static void TaskMethod(int index)
{
     Console.WriteLine(index);
}

执行结果:

c# for循环中创建线程执行问题

直接异常了,按照常理不应该呀,我们再将原理的代码改一下看看结果如何

我们先来创建执行线程代码,然后在写输出代码:


static void Main(string[] args)
       {
           new Task(() =>
           {
               TaskMethod(1);
           }).Start();
           Console.WriteLine("输出内容");
           Console.ReadLine();
       }

输出结果:

c# for循环中创建线程执行问题

由此我们可以得出一个结论,就是:创建执行Task.Run()是在另外一个子线程中执行的,他的创建+执行需要消耗一定的时间,而主线程方法是不会受Task的影响,他会直接执行
因此,我们最初的代码中,for循环 0到taskConsumes.Count,很快就会执行完成。当他执行完成最后的 i 其实不是taskConsumes.Count-1(因为for是 i++形式),而是

c# for循环中创建线程执行问题

 所以,在执行子线程的时候,其实就是去拿taskConsumes[5],准定就超出索引异常了。

那现在我们如果不想让程序出错的执行,给他改一下代码:


static void Main(string[] args)
       {
           List<int> taskConsumes = new List<int>() { 1, 2, 3, 4, 5 };
           for (int i = 0; i < taskConsumes.Count; i++)
           {
               int indexI = i;
               new Task(() =>
               {
                   TaskMethod(taskConsumes[indexI]);
               }).Start();
           }
           Console.ReadLine();
       }

执行结果:

c# for循环中创建线程执行问题

这样,我们在for中创建一个临时变量indexI,每个工作域中的i都赋予了局部变量indexI,Task中的变量就是局部变量indexI了,而不是for的全部变量i,程序也就达到了我们想要的效果了(另外Task子线程中执行顺序也不是顺序执行的)。

来源:https://www.cnblogs.com/19930521zhang/p/15523328.html

标签:c#,for,循环,创建,线程
0
投稿

猜你喜欢

  • Java中锁的实现和内存语义浅析

    2021-06-04 01:09:49
  • Android框架Volley使用:ImageRequest请求实现图片加载

    2022-03-01 11:30:06
  • spring boot security设置忽略地址不生效的解决

    2022-06-07 16:37:30
  • java 示例讲解循环语句的使用

    2021-12-17 06:23:01
  • Android Handler机制详解原理

    2023-10-29 22:03:44
  • 手动添加jar包进Maven本地库内的方法

    2023-08-03 03:10:09
  • C#打包应用程序,与.NETFramework介绍

    2022-03-29 15:29:20
  • 分享15款Java程序员必备的开发工具

    2021-12-07 19:09:07
  • 验证本机的excel版本的C#代码

    2021-11-01 07:13:20
  • 一步步教你写一个SpringMVC框架

    2022-11-26 03:37:21
  • Java中的Kotlin 内部类原理

    2021-10-26 23:02:13
  • java文件下载代码实例(单文件下载和多文件打包下载)

    2023-02-16 00:38:37
  • Spring BOOT AOP基础应用教程

    2023-05-29 20:33:32
  • 【IntelliJ IDEA】Maven构建自己的第一个Java后台的方法

    2023-09-24 20:11:16
  • SpringCloud高可用配置中心Config详解

    2023-11-17 11:25:00
  • java 数据结构单链表的实现

    2022-07-24 09:45:33
  • Java调用明华RF读写器DLL文件过程解析

    2022-12-17 04:31:06
  • 为Xamarin.Forms的导航栏增加搜索功能

    2022-01-28 18:38:58
  • C#中神器类BlockingCollection的实现详解

    2022-10-13 07:41:02
  • c#动态执行脚本的3种方式详解

    2021-09-11 13:41:58
  • asp之家 软件编程 m.aspxhome.com