QueueUserWorkItem引发的闭包与变量共享

//1、
public void SaveModel(testmodel msg)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(SaveModelThread), msg);

        }
public void SaveModelThread(testmodel msg)
……
//操作内容
……

//2、错误用法XXX
public void SaveModel(testmodel msg)
        {
            ThreadPool.QueueUserWorkItem((a)=>{
             SaveModelThread(msg);

});

        }

资源:

http://www.cnblogs.com/JeffreyZhao/archive/2009/03/13/anonymous-method-false-sharing.html#!comments

时间: 2024-11-06 04:07:36

QueueUserWorkItem引发的闭包与变量共享的相关文章

递归,闭包,闭包与变量

递归是在一个函数内部调用自身: function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1) } } 但是会出现问题: var fan=factorial; fun(4); factorial=null; 在调用fun(4)时,先执行上面的函数,到else内时,factorial已经被改了,所以得不到正确的结果. 使用arguments.callee代替函数就不会出错. 闭包: 创建函数时会预先

JS 中闭包的变量 闭包与this

闭包与变量: 作用域链的一个副作用,闭包只能取得包含函数中任何变量的最后一个值.别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量. function fn1(){ //创建一个数组 var arr = new Array(); //为数组赋值,此时i是保存在fn1 这个作用域中 for (var i = 0; i <10; i++) { arr[i] = function(){ return i } } return arr; } var fs = fn1(); for (var i =

Javascript 闭包与变量

1.闭包与变量 JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值.闭包所保存的是整个变量对象,而不是某个特殊的值. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function createFunctions(){      var result=new Array();              for (var i=0;i<10;i++){          result[i]=function(){         

如何在Exe和BPL插件中实现公共变量共享及窗口溶入技术Demo源码

1.Delphi编译方式介绍: 当我们在开发一个常规应用程序时,Delphi可以让我们用两种方式使用VCL,一种是把VCL中的申明单元及实现单元全部以静态编译的方式编译并链接进Exe可执行文件中,这样做的好处就是发布程序时只需要发布独立的可执行文件,当我们使用了的第三方DLL.OCX等时,无需发布*.bpl等文件,但EXE程序文件的体积会较大. 另外一种是把VCL库以运行时状态(即把VCL库中的申请单元静态编译进EXE可执行文件,而单元的实行方法则通过LoadLiabary/LoadPackag

python之多线程变量共享

因为多线程的时候,线程之间的数据共享,最大的危险是都可以来修改变量例如 import time ,threading balance = 0 def change_it(n): global balance balance = balance +n balance = balance - n def run_thread(n): for i in range(1000000): change_it(n) t1 = threading.Thread(target = run_thread , ar

一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2) { // 函数体 } 在Firefox,Safari,Chrome和Opera有效: 就是通过这个属性可以访问到这个函数指定的名字. console.log(functionName.name); // 'functionName' 函数声明: 它的一个重要特点就是:函数声明提升,就是在执行代码

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题

ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序会出现闪退.当然是指不处理那个异常的情况下.这不公司的CMS在生产环境频频出现闪退的情况.该死的是,原来用老机器配置不高的情况下没有出现过.换了更好的新机器后出现的. // // 摘要: // 将方法排入队列以便执行,并指定包含该方法所用数据的对象.此方法在有线程池线程变得可用时执行. // //

初识javascript 闭包和变量提升

先上一小段代码: 1 function outFun(){ 2 var num = 2; 3 function inFun(){ 4 console.log(num); 5 } 6 return inFun; 7 } 8 var out = outFun(); 9 out();//2,这里能够访问,其实是把num这个变量往上面一层提升了一下,out()往里面执行了一层.刚刚好在同一层. 10 console.log(num);//浏览器报错,不能访问outFun函数里面的局部变量num 敲黑板,

Java多线程编程:变量共享分析(Thread)

在编写多线程程序时,最重要的就是搞清楚哪些变量是共享的,哪些变量是不共享的.也就是要分析清楚其中的原理呀. 因为最近要使用多线程就看了一些,对使用Thread类的子类创建线程的情况,总结如下: 1.方法体内部定义的局部变量不共享 这是因为方法内部定义的变量是在运行时动态生成的.每个线程都有一个自己的堆栈,用于保存运行时的数据. 最容易理解的就是递归调用时候,每次的入栈出栈操作.如下,每次调用时,变量aa都是在运行时堆栈上保存的,方法结束变量也就释放了. public int fib(int n)