服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# for循环中创建线程执行问题

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

2022-12-08 11:26随风去远方 C#

这篇文章主要介绍了有关c# for循环中创建线程执行问题,下面文章将将以举例的方式展开for循环中创建线程执行问题的内容,需要的朋友可以参考一下,希望对你有所帮助

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

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子线程中执行顺序也不是顺序执行的)。

到此这篇关于c# for循环中创建线程执行问题的文章就介绍到这了,更多相关for循环中创建线程执行内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/19930521zhang/p/15523328.html

延伸 · 阅读

精彩推荐
  • C#C# 设计模式系列教程-观察者模式

    C# 设计模式系列教程-观察者模式

    将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这...

    Wang Juqiang10212021-11-23
  • C#C# winform打开Excel文档的方法总结(必看篇)

    C# winform打开Excel文档的方法总结(必看篇)

    下面小编就为大家带来一篇C# winform打开Excel文档的方法总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    C#教程网8832021-12-21
  • C#在C#中使用Channels的完整教程

    在C#中使用Channels的完整教程

    这篇文章主要介绍了在C#中使用Channels的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    码农读书5042022-11-07
  • C#C# 调用WebService的方法

    C# 调用WebService的方法

    这篇文章主要介绍了C# 调用WebService的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下...

    osc_omyprm565282022-09-29
  • C#C#如何连接MySQL数据库

    C#如何连接MySQL数据库

    这篇文章主要介绍了C#如何连接MySQL数据库,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    千里Z单骑11052022-10-11
  • C#C#代码延时的几种实现

    C#代码延时的几种实现

    本文主要介绍了C#代码延时的几种实现,主要介绍了三种方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    陈言必行4262022-11-29
  • C#C#求数组中元素全排列的方法

    C#求数组中元素全排列的方法

    这篇文章主要介绍了C#求数组中元素全排列的方法,较为详细的分析了数组全排列算法的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    北风其凉3912021-10-18
  • C#c# 使用异步编程的方法

    c# 使用异步编程的方法

    这篇文章主要介绍了c# 使用异步编程的方法,文中讲解非常细致,帮助大家更好的理解c# 异步编程,感兴趣的朋友可以了解下...

    每天进步多一点10802022-09-29