为了查看效果,我特意用随机数来代替固定的sleep时间,这样更有说明力。上面程序的运行结果如下:
五、TLS小结
1)TLS基础
可以使用托管线程本地存储区 (TLS) 存储某一线程和应用程序域所独有的数据。 .NET Framework 提供了两种使用托管 TLS 的方式:线程相关的静态字段和数据槽。 线程相关的静态字段提供的性能比数据槽的性能要好得多,而且它还启用了编译时类型检查。
如果您可以在编译时预料到您的确切需要,请使用线程相关的静态字段(在 Visual Basic 中为线程相关的 Shared 字段)。 线程相关的静态字段可提供最佳性能。 它们还具备编译时类型检查的优点。
如果只能在运行时发现您的实际需要,请使用数据槽。 数据槽比线程相关的静态字段慢一些且更加难于使用,并且数据存储为 Object 类型,因此必须将其强制转换为正确的类型才能使用。
2)2种TLS特点
a)无论是使用线程相关的静态字段还是使用数据槽,托管 TLS 中的数据都是线程和应用程序域组合所独有的。
在应用程序域内部,一个线程不能修改另一个线程中的数据,即使这两个线程使用同一个字段或槽时也不能。
当线程从多个应用程序域中访问同一个字段或槽时,会在每个应用程序域中维护一个单独的值。
例如,如果某个线程设置线程相关的静态字段的值,接着它进入另一个应用程序域,然后检索该字段的值,则在第二个应用程序域中检索的值将不同于第一个应用程序域中的值。 在第二个应用程序域中为该字段设置一个新值不会影响第一个应用程序域中该字段的值。 同样,当某个线程获取两个不同应用程序域中的同一命名数据槽时,第一个应用程序域中的数据将始终与第二个应用程序域中的数据无关。
b)如果您知道一些数据总是某个线程和应用程序域组合所独有的,请向该静态字段应用 ThreadStaticAttribute 特性。 与使用任何其他静态字段一样使用该字段。 该字段中的数据是每个使用它的线程所独有的。线程相关的静态字段的性能优于数据槽,并且具有编译时类型检查的优点。
c)请注意,任何类构造函数代码都将在访问该字段的第一个上下文中的第一个线程上运行。 在同一应用程序域内的所有其他线程或上下文中,如果字段是引用类型,它们将被初始化为 null(在 Visual Basic 中为 Nothing);如果字段是值类型,它们将被初始化为它们的默认值。 因此,您不应依赖于类构造函数来初始化线程相关的静态字段。 而应避免初始化线程相关的静态字段并假定它们初始化为 null (Nothing) 或它们的默认值。
d)在 .NET Framework 4 版中,可以使用 System.Threading.ThreadLocal(Of T) 类创建线程本地对象,在第一次使用该对象时它将惰式初始化,这样就解决了c中所指问题。
d).NET Framework 提供了线程和应用程序域组合所独有的动态数据槽。 数据槽包括两种类型:命名槽和未命名槽。 两者都是通过使用 LocalDataStoreSlot 结构来实现的。
若要创建命名数据槽,请使用 Thread.AllocateNamedDataSlot 或 Thread.GetNamedDataSlot 方法。 若要获取对某个现有命名槽的引用,请将其名称传递给 GetNamedDataSlot 方法。
若要创建未命名数据槽,请使用 Thread.AllocateDataSlot 方法。
e)对于命名槽和未命名槽,请使用 Thread.SetData 和 Thread.GetData 方法设置和检索槽中的信息。 这些都是静态方法,它们始终作用于当前正在执行它们的线程的数据。
f)命名槽可能很方便,因为您可以在需要它时通过将其名称传递给 GetNamedDataSlot 方法来检索该槽,而不是维护对未命名槽的引用。 但是,如果另一个组件使用相同的名称来命名其线程相关的存储区,并且有一个线程同时执行来自您的组件和该组件的代码,则这两个组件可能会破坏彼此的数据。 (本方案假定这两个组件在同一应用程序域内运行,并且它们并不用于共享相同数据。)
g)线程使用本地存储内存机制来存储线程特定的数据。 公共语言运行时在创建每个进程时给它分配一个多槽数据存储区数组。 线程可以分配数据存储区中的数据槽,存储和检索槽中的数据值,以及在线程到期之后释放槽以供重新使用。 每个线程的数据槽都是唯一的。 其他任何线程(即便是子线程)均无法获取该数据。
- 大小: 63.6 KB
分享到:
相关推荐
《VB.NET网络编程指南》是一本专为VB.NET开发者设计的教程,主要涵盖了如何使用VB.NET进行网络通信和开发Web应用程序的关键技术。本指南通过一系列的htm格式文档,以图文并茂的方式阐述了网络编程的核心概念和实战...
总之,VB.NET实现TCP通讯涉及了.NET Framework的网络编程接口,包括Socket和TcpListener类的使用,数据的发送与接收,以及可能的多线程和安全处理。通过实践和学习,你可以掌握创建可靠、高效的TCP应用程序的技能。
2. **多线程**:P2P网络通常需要同时处理多个连接,因此,多线程编程是必要的。VB.NET支持多线程,可以使用Thread类或ThreadPool类来实现。 3. **数据交换格式**:为了在网络间交换信息,需要一种数据交换格式,如...
8. **数据库存储**: 聊天记录、用户信息等可能需要持久化存储,VB.NET可以与各种数据库系统(如SQL Server、SQLite或MySQL)配合,通过ADO.NET库进行数据操作。 9. **Mini_Demo**: 这可能是项目中的一个简化示例或...
.NET分布式编程是构建大型、可扩展的网络应用的关键技术,C#作为.NET框架的主要编程语言,为开发者提供了丰富的工具和库来实现这一目标。本资料《NET分布式编程(C#).pdf》全面涵盖了这一主题,旨在帮助读者深入理解...
在VB.NET中进行网络通信是开发跨平台应用和构建分布式系统的关键技能。"VB.NET网络通信实战"这本书籍深入探讨了如何使用VB.NET语言来实现网络功能,特别是着重讲解了SCOKET编程技术。SCOKET编程是网络通信的基础,它...
在本文中,我们将深入探讨VB.NET编程语言如何与P2P网络技术相结合,构建高效、可靠且可扩展的网络应用。 点对点网络是一种分布式网络架构,其中每个参与者(节点)既是服务的提供者也是服务的消费者。这种模式在...
在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET提供了一整套丰富的类库,使得开发者可以轻松地实现客户端和服务器之间的通信。这些类库主要集中在System.Net命名空间下,它包含了处理HTTP...
在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET(Visual Basic .NET)是Microsoft .NET框架的一部分,它提供了一系列强大的工具和类库,使得开发者能够轻松地创建网络应用。本指南将深入...
在VB.NET中构建一个类似QQ的即时通讯软件是一项复杂但有趣的任务,涉及到多个技术领域,包括网络编程、多线程处理、数据存储和用户界面设计等。VB.NET是微软的面向对象的编程语言,它提供了丰富的类库和工具,使得...
4. **多线程**:为了实现用户界面的实时更新和后台任务的执行,如接收消息、上传下载文件,需要掌握多线程编程。 5. **XML或JSON数据格式**:通常用于存储和传输用户数据,如好友列表、聊天记录等。 6. **数据库...
### VB.NET中的Socket异步编程知识点 #### 一、Socket编程概述 - **定义**:Socket编程是一种在不同计算机之间进行通信的方式。它基于TCP/IP协议族,允许开发者创建能够跨网络交换数据的应用程序。 - **特点**: ...
在VB.NET编程环境中,发送电子邮件是一项常见的任务,尤其在企业级应用中,如自动化报告、通知服务等。本文将深入探讨使用VB.NET实现邮件发送,包括携带附件的功能。 首先,VB.NET利用System.Net.Mail命名空间中的...
VB.NET是一种基于.NET Framework的编程语言,由微软公司开发,用于构建Windows应用程序、Web应用程序以及分布式系统。在VB.NET中进行网络编程,可以利用丰富的类库来实现客户端和服务器之间的通信,例如HTTP、FTP、...
标题中的 "[VB.NET源码]发送邮件的示例代码" 提示我们,这是一个关于使用VB.NET编程语言编写发送电子邮件的代码示例。VB.NET是Microsoft .NET框架的一部分,用于开发Windows应用程序和其他网络服务。在.NET环境中,...
在VB.NET中,Socket编程是一种基础且强大的网络通信技术,它允许程序通过网络发送和接收数据。QQ作为一款流行的即时通讯软件,其背后的通信机制也涉及到Socket编程。本压缩包中的"vb.net socket编程的QQ代码"可能...
总之,“VB.NET聊天通信软件开发”是一个集理论与实践于一体的学习资源,它涵盖了网络编程的基础知识,以及VB.NET语言在实际项目中的应用技巧。通过深入学习和实践,开发者不仅能掌握VB.NET的网络编程,还能提升解决...