C# 线程池ThreadPool.QueueUserWorkItem传递到队列方法的数据对象引用验证

C# 线程池ThreadPool.QueueUserWorkItem传递到队列方法的数据对象引用验证

    线程池很常用!尤其今天要介绍的这个方法更是常用!CLR托管的线程池对于线程管理,调度,资源耗用的启发式监测,线程终结时的资源回收,可伸缩性的创建和维护线程方面都具有其他任何线程机制无法比拟的优势,因此弄懂弄清ThreadPool下的方法尤为重要,可以帮助我们写出更效率的代码。


ThreadPool.QueueUserWorkItem顾名思义,将用户工作项加入到队列中去,当然我们的工作项是方法,因为方法是状态改变的功能集合!这个方法有一个重载:一个是只有一个回调函数参数的,另一个是包含两个参数:回调函数,函数的数据对象,其中在两个方法中回调函数都是以WaitCallBack委托作为包装器,这个委托定义是

public delegate void WaitCallback(Object state)

在ThreadPool.QueueUserWorkItem调用时不传入数据对象,则state为null,否则为我们传入的数据对象。这篇文章的目的就是验证传入的数据对象到WaitCallBack是否为一个引用,而非该引用的副本。

很多情况下我们用第一个已经能满足我们的需求了,单单执行一个回调函数;可是程序毕竟是解决现实问题的,必然涉及到一些其他可能的情况,这时候我们的第二个重载就起作用了,在将函数传递到线程池队列中时,我们可以为该方法传递一个数据对象供函数调用。

事实上:传入的确实是一个引用,你可以在WaitCallBack中修改传入的引用,这在事件控制中尤为重要。

下面我采用一个Demo验证我的结论(核心代码我都添加了注释):

代码包含一个测试的对象,StatePass包含一个AutoResetEvent事件和一个字节数组对象,用来验证引用传入到WaiCallBack是否可以被修改,如果修改了那么主线程会收到信号,同时将字节数组打印出来!


输入效果如下:


总结:该方法传递的是引用而非副本,可以在回调内部修改外部传入的引用对象,通过它你可以方便控制完成情况以及状态修改通知!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值