接上节,我们可以使用下面语句创建一个线程本地变量,利用静态TLS功能
Dim betterCounter As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 1)
betterCounter的值初始化为1。在本程序中,jg被初始化为50,并定义成线程本地变量
Dim jg As ThreadLocal(Of Integer) = New ThreadLocal(Of Integer)(Function() 50)
然后,我们使用jg.Value 来读写这个本地变量的值
jg.Value -= mynum
三、动态TLS
Imports System
Imports System.Threading
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
'创建线程对象
mythread1 = New Thread(AddressOf mythreadrun)
mythread2 = New Thread(AddressOf mythreadrun)
mythread3 = New Thread(AddressOf mythreadrun)
Console.WriteLine(Now.ToLongTimeString & "线程对象创建完毕,开始执行线程")
'执行线程
mythread1.Start("线程1")
mythread2.Start("线程2")
mythread3.Start("线程3")
'等待线程完成
mythread1.Join()
mythread2.Join()
mythread3.Join()
'线程执行完毕
Console.WriteLine(Now.ToLongTimeString & "线程执行完毕!")
End Sub
Public Sub mythreadrun(ByVal data As Object)
Dim mynum As Integer
'分配一个新的槽,这个槽存放线程本地数据,槽名称
'必须唯一
Thread.AllocateNamedDataSlot(data)
Dim jg As LocalDataStoreSlot
jg = Thread.GetNamedDataSlot(data)
Thread.SetData(jg, 100)
Try
For mynum = 1 To 10
Thread.SetData(jg, Thread.GetData(jg) - mynum)
Console.WriteLine(data & " " & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",计算结果为:" & Thread.GetData(jg))
Thread.Sleep(2)
Next
Catch
Console.WriteLine(data & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
Finally
Thread.FreeNamedDataSlot(data)
End Try
End Sub
End Module
运行结果如我们所愿,jg变量通过动态TLS提供的槽机制实现了线程本地变量
'分配一个新的槽,这个槽存放线程本地数据,槽名称为
'myjg,名称必须唯一
Thread.AllocateNamedDataSlot(data)
Dim jg As LocalDataStoreSlot
jg = Thread.GetNamedDataSlot(data)
Thread.SetData(jg, 100)
以上代码是关健,我们使用命名数据槽,当然,我们也可以使用未命名槽,因为未命名数据槽相对较简单,所以这里使用了命名数据槽,向大家演示一下其功能。
注意:
如果使用 AllocateNamedDataSlot 方法已分配已经存在的指定名称的槽,此方法会引发异常,且无法测试是否已分配某个槽。另外,使用此方法分配的数据槽必须使用 FreeNamedDataSlot 来释放。
本例中,我们分配槽使用下面语句
Thread.AllocateNamedDataSlot(data)
获取某个命名槽的引用,以便进行下一步操作
jg = Thread.GetNamedDataSlot(data)
Thread.SetData和Thread.GetData可写、读槽中数据
四、数据槽的值在线程或上下文对象之间不共享
LocalDataStoreSlot 结构可用作本地存储内存机制,线程和上下文可以使用此机制分别存储线程特定的数据和上下文特定的数据。 公共语言运行时在创建每个进程时给它分配一个多槽数据存储区数组。 线程或上下文调用各种函数在数据存储区中分配数据槽、在槽内存储和检索数据值、以及释放数据槽以便在线程或上下文过期后重新使用它。
对于每个线程或上下文,数据槽都是唯一的;它们的值在线程或上下文对象之间不共享。 数据槽可根据名称或根据索引号来分配。
我们可以从下面程序看出
Imports System
Imports System.Threading
Module Module1
Sub Main()
Dim mythread1 As Thread
Dim mythread2 As Thread
Dim mythread3 As Thread
Dim jg As LocalDataStoreSlot
'创建线程对象
mythread1 = New Thread(AddressOf mythreadrun)
mythread2 = New Thread(AddressOf mythreadrun)
mythread3 = New Thread(AddressOf mythreadrun)
Console.WriteLine(Now.ToLongTimeString & "线程对象创建完毕,开始执行线程")
'jg = Thread.AllocateNamedDataSlot("myjg")
' Thread.SetData(jg, 100)
'执行线程
mythread1.Start("线程1")
mythread2.Start("线程2")
mythread3.Start("线程3")
'等待线程完成
mythread1.Join()
mythread2.Join()
mythread3.Join()
'线程执行完毕
Console.WriteLine(Now.ToLongTimeString & "线程执行完毕!")
Thread.FreeNamedDataSlot("myjg")
End Sub
Public Sub mythreadrun(ByVal data As Object)
Dim randomGenerator As New Random()
Dim mynum As Integer
'分配一个新的槽,这个槽存放线程本地数据,槽名称为
'myjg
Dim jg As LocalDataStoreSlot
Try
jg = Thread.AllocateNamedDataSlot("myjg")
Catch
jg = Thread.GetNamedDataSlot("myjg")
End Try
Thread.SetData(jg, 100)
Try
For mynum = 1 To 10
Thread.SetData(jg, Thread.GetData(jg) - mynum)
Console.WriteLine(data & " " & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",计算结果为:" & Thread.GetData(jg))
Thread.Sleep(randomGenerator.Next(10, 200))
Next
Catch
Console.WriteLine(data & " " & Now.ToLongTimeString & "线程异常终止!")
'终止线程
Thread.CurrentThread.Abort()
End Try
End Sub
End Module
- 大小: 71.4 KB
分享到:
相关推荐
《VB.NET网络编程指南》是一本专为VB.NET开发者设计的教程,主要涵盖了如何使用VB.NET进行网络通信和开发Web应用程序的关键技术。本指南通过一系列的htm格式文档,以图文并茂的方式阐述了网络编程的核心概念和实战...
总之,VB.NET实现TCP通讯涉及了.NET Framework的网络编程接口,包括Socket和TcpListener类的使用,数据的发送与接收,以及可能的多线程和安全处理。通过实践和学习,你可以掌握创建可靠、高效的TCP应用程序的技能。
2. **多线程**:P2P网络通常需要同时处理多个连接,因此,多线程编程是必要的。VB.NET支持多线程,可以使用Thread类或ThreadPool类来实现。 3. **数据交换格式**:为了在网络间交换信息,需要一种数据交换格式,如...
.NET分布式编程是构建大型、可扩展的网络应用的关键技术,C#作为.NET框架的主要编程语言,为开发者提供了丰富的工具和库来实现这一目标。本资料《NET分布式编程(C#).pdf》全面涵盖了这一主题,旨在帮助读者深入理解...
8. **数据库存储**: 聊天记录、用户信息等可能需要持久化存储,VB.NET可以与各种数据库系统(如SQL Server、SQLite或MySQL)配合,通过ADO.NET库进行数据操作。 9. **Mini_Demo**: 这可能是项目中的一个简化示例或...
在VB.NET中进行网络通信是开发跨平台应用和构建分布式系统的关键技能。"VB.NET网络通信实战"这本书籍深入探讨了如何使用VB.NET语言来实现网络功能,特别是着重讲解了SCOKET编程技术。SCOKET编程是网络通信的基础,它...
在VB.NET中进行网络编程是开发跨平台应用程序和网络服务的关键技能。VB.NET提供了一整套丰富的类库,使得开发者可以轻松地实现客户端和服务器之间的通信。这些类库主要集中在System.Net命名空间下,它包含了处理HTTP...
在本文中,我们将深入探讨VB.NET编程语言如何与P2P网络技术相结合,构建高效、可靠且可扩展的网络应用。 点对点网络是一种分布式网络架构,其中每个参与者(节点)既是服务的提供者也是服务的消费者。这种模式在...
在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是一种基于.NET Framework的编程语言,由微软公司开发,用于构建Windows应用程序、Web应用程序以及分布式系统。在VB.NET中进行网络编程,可以利用丰富的类库来实现客户端和服务器之间的通信,例如HTTP、FTP、...
在VB.NET编程环境中,发送电子邮件是一项常见的任务,尤其在企业级应用中,如自动化报告、通知服务等。本文将深入探讨使用VB.NET实现邮件发送,包括携带附件的功能。 首先,VB.NET利用System.Net.Mail命名空间中的...
标题中的 "[VB.NET源码]发送邮件的示例代码" 提示我们,这是一个关于使用VB.NET编程语言编写发送电子邮件的代码示例。VB.NET是Microsoft .NET框架的一部分,用于开发Windows应用程序和其他网络服务。在.NET环境中,...
在VB.NET中,Socket编程是一种基础且强大的网络通信技术,它允许程序通过网络发送和接收数据。QQ作为一款流行的即时通讯软件,其背后的通信机制也涉及到Socket编程。本压缩包中的"vb.net socket编程的QQ代码"可能...
3. **VB.NET中的网络编程类库** - **System.Net.Sockets**:提供对TCP和UDP协议的支持,包括TcpClient、TcpListener、UdpClient和UdpServer等类。 - **System.Net命名空间**:包含HTTP和FTP等Web通信相关的类。 4...