后台工作线程是否被重用?
具体来说,如果我在后台工作程序的 DoWork() 方法期间设置了一个命名数据槽(线程本地存储),那么该数据槽的值是否会持续存在,以后可能会在其他线程中找到?
没想到,居然有这个BUG。。。
编辑:这篇博文建议BackGroundWorker使用ThreadPool,这意味着线程被重用。所以问题变成了;重复使用的线程是否可能在调用之间保持线程本地存储?
后台工作线程是否被重用?
具体来说,如果我在后台工作程序的 DoWork() 方法期间设置了一个命名数据槽(线程本地存储),那么该数据槽的值是否会持续存在,以后可能会在其他线程中找到?
没想到,居然有这个BUG。。。
编辑:这篇博文建议BackGroundWorker使用ThreadPool,这意味着线程被重用。所以问题变成了;重复使用的线程是否可能在调用之间保持线程本地存储?
线程池重用线程时,不会清除线程本地存储中的数据,也不会清除带有 ThreadStaticAttribute 属性标记的字段中的数据。因此,通过一种方法放置在线程本地存储中的数据可以暴露给由同一线程池线程执行的任何其他方法。访问标记有 ThreadStaticAttribute 属性的字段的方法可能会遇到不同的数据,具体取决于执行它的线程池线程。
来源:http: //msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
如果未在 MSDN 中指定,则需要检查源(或通过反射器)以确定这一点。
如果未指定,则不能依赖在未来版本的 .NET 中未更改的当前行为。
编辑:看起来它正在使用线程池,所以线程将被重用。