在异步调用匿名函数时明智地使用局部变量

问题:由于在多线程中使用了匿名函数外的局部变量而导致的Bug

执行代码

static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
    {
        Thread t = new Thread(delegate()
        {
            Thread.Sleep(new Random().Next(1, 10000));
            Console.Write(i + ", ");
        });
        t.Start();
    }
}

将得到输出:10, 10, 10, 10, 10, 10, 10, 10, 10, 10,

而不是我们期望的类似于:3, 5, 6, 1, 0, 7, 9, 8, 4, 2, 这样的输出。这是为什么呢?(在实际 项目中出现这个Bug的代码请参考[1])

分析:使用Reflector查看编译之后的代码

下面是编译前后的代码对比。(使用Reflector的具体方法请参考[2],这里仅展现结果)

时间: 2024-10-02 00:16:44

在异步调用匿名函数时明智地使用局部变量的相关文章

解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)

本篇文章是对php中使用异步调用获取数据时出现(由于出现错误c00ce56e而导致此项操作无法完成)的解决方法进行了详细的分析介绍,需要的朋友参考下   [详细错误]:由于出现错误 c00ce56e 而导致此项操作无法完成 [造成原因]:未指定输出编码格式. [解决办法]:句首加入header("content-type:text/html; charset=UTF-8");  

ndk jni c++ android-Android上利用JNI调用OpenCV函数时出现Fatal signal 11错误

问题描述 Android上利用JNI调用OpenCV函数时出现Fatal signal 11错误 我想在Android上用OpenCV实现人脸识别功能,即事先有一个我提供的人脸训练库,然后检测出人脸后,识别他和训练库中的哪类人最像. 我已在windows平台实现了该功能,并将训练好的FaceRecognizer通过save的方式存储成了xml.我将xml文件放入了Android手机某目录下,然后想利用JNI的方式在Android app中使用OpenCV载入该数据库,但运行到这一行就会报错: F

asp.net怎么异步调用一个函数

问题描述 asp.net怎么异步调用一个函数 我想在一个页面的pageload里使用异步调用一个函数,求讲解大概的步骤和思路,网上的一些教程看不懂,新手求理解 解决方案 如果是VS2012+,那么最简单的是直接使用 async 修饰你的方法,用await异步调用.http://www.cnblogs.com/therock/articles/2382534.html 解决方案二: 有没有人答一下啊,越简单越好,我只想要个大概的过程 解决方案三: 高手们都去玩斗地主了吗..............

C语言内存释放与调用子函数时间变长

问题描述 C语言内存释放与调用子函数时间变长 各位大神,你们好: 小弟最近用C语言编程遇到这样一个问题(代码比较多,就不粘了,见谅): 在子函数A中用malloc申请内存,在调用函数A的B函数中释放申请的内存.重复运行100次函数B,发现:在函数B中若不释放A的申请的内存,每次A运行的时间基本一样,而内存占用量持续上升:若在函数B中释放A申请的内存,占用内存问题解决了,然后每次调用A的时间又持续上升. 完全没有搞明白这是个什么情况,你们怎么看? 解决方案 堆上的内存申请和释放一定要一一对应,用完

java中panel实现线程接口以后,要调用repaint函数时,不进run函数

问题描述 java中panel实现线程接口以后,要调用repaint函数时,不进run函数 具体情况是 mypanel类实现了线程接口,在run函数中定义了sleep(100)后调用repaint函数,做一个小坦克游戏,在repaint之前要判断是否击中坦克,击中后要显示三张图片来体现爆炸效果,可是经过调试发现,每次第一次击中的时候,都是直接好多次repaint,没有休眠,后来发现根本就没有进mypanel的run()方法,好像有另一个其他线程再调用paint.这是怎么回事?感谢大家了 pack

在调用memcpy函数时出现 异常: 0xC0000005: 读取位置 0x006bd000 时发生访问冲突

问题描述 在调用memcpy函数时出现 异常: 0xC0000005: 读取位置 0x006bd000 时发生访问冲突 BOOL Kirsch(BYTE *pData,int Width,int Height) {//定义实现Kirsch算法的8个模板: int i,j,s,t,k,max,sum[8]; static int a[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}}; static int a1[3][3]={{-3,+5,+5},{-3,0,+5},

WebService中更新函数传入值,再调用其中函数时,函数的参数还是未改变

背景: 今天写了一个webservice,又修改了一下函数的返回类型.out参数的数量(改为:public void SendData(DataSet ds, out string result,out string errMsg)),之后更新引用,再调用的使用时候发现SendData显示为public string SendData(DataSet ds, out string errMsg)形式,不管是添加webservice还是reference service都不行,解决方案也清理过,i

调用DLL函数时报告堆栈异常的解决方法

The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. 解决方法: 1. VC6   工程->设置->C/C++-&g

调用system函数时,如何隐藏其dos窗口

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195003