前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# Task.Run调用外部参数

C# Task.Run调用外部参数

作者头像
zls365
发布2020-10-10 09:42:41
4.3K0
发布2020-10-10 09:42:41
举报
文章被收录于专栏:CSharp编程大全

首先讲一下:

c# Task启动带参数和返回值的方法:

Task启动带参数

代码语言:javascript
复制
Task.Run(() => test("123"));

public void Test(string s){
...todo..
}

Task启动带参数和返回值的方法

代码语言:javascript
复制
var s = Task.Run(() => isTest("ss"));
var t = s.Result;

private bool isTest(string isno) {
return true;
}

然后开始我们的实例:即通过for循环开启十个task,并分别在task任务中输出1~10.

代码语言:javascript
复制
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 被捕获,需要引入中间变量,下面的代码就可以正常执行

代码语言:javascript
复制
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);

        }
        
    }
    }

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先讲一下:
  • c# Task启动带参数和返回值的方法:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档