VB.NET中的线程操作(Thread,Mutex)

2024-05-01 01:38
文章标签 线程 操作 net vb thread mutex

本文主要是介绍VB.NET中的线程操作(Thread,Mutex),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VB.NET中的线程操作(Thread,Mutex)

By Tyouvivi 2008/04/16

VB.NET 2005 中线程操作稍有点麻烦,Abort()方法调用时会产生System.Threading.ThreadAbortException异常信息,而继续已挂起的线程方法Resume()和挂起方法Suspend()也不再支持,线程的暂停、再开、结束不是很方便,在此使用Mutex类(同步基元)进行线程的操作。

Mutex介绍

当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。

可以使用 WaitHandle..::.WaitOne 方法请求互斥体的所属权。拥有互斥体的线程可以在对 WaitOne 的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用 ReleaseMutex 方法同样多的次数以释放互斥体的所属权。Mutex 类强制线程标识,因此互斥体只能由获得它的线程释放。相反,Semaphore 类不强制线程标识。

如果线程在拥有互斥体时终止,则称此互斥体被放弃。将此 mutex 的状态设置为收到信号,下一个等待线程将获得所有权。从 .NET Framework 
2.0  版开始,在获取被放弃 mutex 的下一个线程中将引发 AbandonedMutexException。在 .NET Framework  2.0  版之前,这样不会引发任何异常。

 ThreadState Form
    三个按钮: ButtonStart、ButtonPause、ButtonStop
    两个状态Label: 执行状况、LabelStatus
   
代码如下:

Public   Class ThreadState

    
''' <summary>
    ''' 状态
    ''' </summary>
    ''' <remarks></remarks>
    Enum ThreadState As Integer
        Runing 
= 1      ''执行中
        Paused = 2      ''暂停
        Stoped = 3      ''结束
    End Enum


    
''' <summary>
    ''' 线程
    ''' </summary>
    ''' <remarks></remarks>
    Private _thread As System.Threading.Thread

    
''' <summary>
    ''' 同步基元,用于进程间同步。
    ''' </summary>
    ''' <remarks></remarks>
    Private _mutex As Threading.Mutex

    
''' <summary>
    ''' 线程状态
    ''' </summary>
    ''' <remarks></remarks>
    Private _state As ThreadState

    
''' <summary>
    ''' 线程调用外部控件方法(Delegate)
    ''' </summary>
    ''' <param name="text"></param>
    ''' <remarks></remarks>
    Delegate Sub SetTextCalled(ByVal [text] As String)

    
''' <summary>
    ''' Form Load
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ThreadTest_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        
''状态初期化
        Me._state = ThreadState.Stoped
        
''按钮初期化
        SetButtonState()
        SetText(
"未开始...")

    
End Sub


    
''' <summary>
    ''' 执行
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Execute()
        
Dim i As Integer = 1

        
''执行直到结束
        Do While Not Me._state = ThreadState.Stoped

            _mutex.WaitOne()
            _mutex.ReleaseMutex()

            SetText(
"执行中... " & "   " & i)
            i 
+= 1
            Threading.Thread.Sleep(
1000)
        
Loop

        SetText(
"结束")
    
End Sub


    
''' <summary>
    ''' 线程开始,再开
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStart.Click

        
If Me._state = ThreadState.Stoped Then
            _thread 
= New System.Threading.Thread(AddressOf Execute)        ''线程开始
            ''同步基元初始化
            _mutex = New Threading.Mutex
            _thread.Start()
        
ElseIf Me._state = ThreadState.Paused Then                           ''线程再开
            ''同步基元释放(线程继续)                     
            _mutex.ReleaseMutex()
        
End If

        
''线程状态
        Me._state = ThreadState.Runing
        SetButtonState()

    
End Sub


    
''' <summary>
    ''' 暂停
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonPause_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonPause.Click
        
'SetText("Pasue")
        ''同步基元暂停(线程暂停)
        _mutex.WaitOne()
        
Me.ButtonStart.Enabled = True
        
Me._state = ThreadState.Paused
        SetButtonState()
    
End Sub


    
''' <summary>
    ''' 结束
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub ButtonStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonStop.Click

        
If Me._state = ThreadState.Paused Then
            
''同步基元释放(线程继续) 
            _mutex.ReleaseMutex()
        
End If
        
''状态设置
        Me._state = ThreadState.Stoped
        SetButtonState()
        _thread 
= Nothing

    
End Sub


    
''' <summary>
    ''' 执行状态
    ''' </summary>
    ''' <param name="str"></param>
    ''' <remarks></remarks>
    Private Sub SetText(ByVal str As String)
        
''线程中调用时需要Invoke(InvokeRequired = True)
        If Me.LabelStatus.InvokeRequired Then
            
Dim d As New SetTextCalled(AddressOf SetText)
            
Me.Invoke(d, New Object() {str})
        
Else
            
Me.LabelStatus.Text = str
        
End If

    
End Sub


    
''' <summary>
    ''' 按钮状态
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub SetButtonState()
        
Select Case Me._state
            
Case ThreadState.Runing
                
Me.ButtonStart.Enabled = False
                
Me.ButtonPause.Enabled = True
                
Me.ButtonStop.Enabled = True
            
Case ThreadState.Paused
                
Me.ButtonStart.Text = "Resume"
                
Me.ButtonStart.Enabled = True
                
Me.ButtonPause.Enabled = False
                
Me.ButtonStop.Enabled = True
            
Case ThreadState.Stoped
                
Me.ButtonStart.Text = "Start"
                
Me.ButtonStart.Enabled = True
                
Me.ButtonPause.Enabled = False
                
Me.ButtonStop.Enabled = False
        
End Select
    
End Sub

End Class

 运行效果如下:

 

这篇关于VB.NET中的线程操作(Thread,Mutex)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950421

相关文章

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE