【问题标题】:What is the mysterious ThreadSafeObjectProvider什么是神秘的 ThreadSafeObjectProvider
【发布时间】:2011-11-25 19:46:46
【问题描述】:

在浏览我的一个项目时,偶然发现了我以前从未见过的文件 MyWebExtentions 中的以下代码(和类)。

Private s_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.ServerComputer)

''' <summary>
''' Returns information about the host computer.
''' </summary>

<Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.ServerComputer
    Get
        Return s_Computer.GetInstance()
    End Get
End Property

所以我尝试查看对象资源管理器但它没有出现,搜索 MSDN 并没有,尝试 stackoverflow 也没有。最后我确实找到了this 文章,它确实解释了它允许您创建“线程安全、线程特定的存储”,但没有解释为什么或如何。

那么请有人好心解释一下这个类的目的是什么,它是如何工作的,以及在非设计者生成的代码中这个类是否有任何适当的使用场景?

【问题讨论】:

  • 我的猜测是代码是从这里借用/翻译的:bartdesmet.net/blogs/bart/archive/2006/03/14/3824.aspx
  • 它是使 My 命名空间在 VB 中工作的内部管道的一部分。它没有什么有趣的,只是一个具有远程意识的单例提供者,并不是所有线程安全的。今天你会考虑 Lazy&lt;T&gt; 类来完成同样的事情。

标签: c# .net vb.net thread-safety designer


【解决方案1】:

当您希望特定变量是线程静态但需要为调用您的方法的每个上下文创建一个线程静态变量时。你会用这个。 这会在每个上下文中保留线程静态变量,其中将某些内容声明为线程静态将仅在创建它的线程中保留它。

这是我的理解,老实说可能完全是假的,但这是我解释它的方式,并作为我在 WCF 工作一段时间的一个例子。

说真的,如果你必须投反对票,但这是我最好的回答。

【讨论】: