【问题标题】:Is thread-local storage persisted between backgroundworker invocations?线程本地存储是否在后台工作程序调用之间持续存在?
【发布时间】:2010-10-08 08:55:50
【问题描述】:

后台工作线程是否被重用?

具体来说,如果我在后台工作程序的 DoWork() 方法期间设置了一个命名数据槽(线程本地存储),那么该数据槽的值是否会持续存在,以后可能会在其他线程中找到?

我没想到,但我有这个错误......

编辑:This blog post 建议 BackGroundWorker 使用 ThreadPool,这意味着线程重复使用。所以问题变成了;重复使用的线程是否可能在调用之间保持线程本地存储?

【问题讨论】:

    标签: c# .net multithreading backgroundworker thread-local


    【解决方案1】:

    线程池重用线程时,不会清除线程本地存储或带有ThreadStaticAttribute属性标记的字段中的数据。因此,通过一种方法放置在线程本地存储中的数据可以暴露给由同一线程池线程执行的任何其他方法。访问标记有 ThreadStaticAttribute 属性的字段的方法可能会遇到不同的数据,具体取决于执行它的线程池线程。

    来源: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

    https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool?redirectedfrom=MSDN&view=netframework-4.8#remarks

    【讨论】:

      【解决方案2】:

      如果 MSDN 中未指定,则需要检查源(或通过反射器)以确定这一点。

      如果未指定,则不能依赖当前行为在未来版本的 .NET 中不会发生变化。

      编辑:看起来它正在使用线程池,因此线程被重用。

      【讨论】:

        猜你喜欢
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        相关资源
        最近更新 更多