多线程文件备份(VB.NET版)

原文链接:Multithreading Backup Utility


   
简介

多线程迟早是我们要面对的一个东西,本文向你展示了一个简单的使用两个线程来拷贝文件的应用程序

Backup将一个目录中文件拷贝到另一个目录中,它使用了一个线程来显示正被拷贝的文件名称,另一个线程用来在拷贝的文件的同时统计文件数目和文件夹数目。这就意味着在拷贝可以开始之前不用浪费时间去等待文件数目的统计完成,我们使用了两个线程同时完成拷贝和统计工作。

Backup对于大数量文件的拷贝也是快速和有效率的。它很快是因为当目标文件已经存在并且没有改变过时就不做拷贝工作,因此它对于重复拷贝来说不错,因为它只拷贝新文件或更新过的文件。

这个程序的另一个特点是当在一个特点文件上发生安全性错误或其他类型错误(当然不包括硬件错误),它不会停止拷贝工作,它将会记录下错误信息并继续完成工作。过后你可以去查看日志文件,它会告诉你发生了什么错误。大部分错误都是由于安全配置问题产生的。

背景知识

为什么要使用多线程呢?一个原因可能一个窗口在忙碌时,你想能点击窗口上的一个按钮。另一个原因是多核时代已经来临,硬件和操作系统级别的多任务也存在,线程无可避免,尤其当我们关注性能时。

好的,你已经决定你想在.Net中使用多线程。你可以使用BackgroundWorker, 不过我假定你应该从System.Threading开始,并直接使用Thread类。个人看来,它更容易使用,并且更具灵活性。

那么线程到底是什么呢?它就好比于一个源自于你的主程序的另一个完全分离的程序。一旦线程启动,主程序对线程完全不知道。它们生死自控。要启动一个或两个线程,你可能想知道如何创建线程,如何传递数据,如何从子线程中回调主应用程序以及主应用程序如何知道是哪个子线程回调了它?下面的代码片段会回答这些问题的。

最后一点,作者将一个类实例的方法赋予了一个线程,尽管可以将主程序的方法赋予线程,但作者认为这样做更好。


    
'  Declare first thread variable. This will be used to copy the files.
     Private  CopyThread  As  Thread  ' 拷贝线程

    
'  Delclare second thread variable. This will be used to count the folders and files.
Private  CountThread  As  Thread  ' 统计线程

统计线程一般在拷贝线程前面完成,除非你拷贝的文件数目很小,那种情况下一切都发生的很快。

另一方面,统计线程结束后,总文件数目会被统计出来,从而用来设置ProgressBar1.Max属性,

下面是启动拷贝线程和统计线程的代码:

   Private   Sub StartCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartCopy.Click
        
'开始拷贝
        ' Validate from and to folders
        If Not SetRootPath Then Exit Sub
        
If Not CheckFromPath() Then Exit Sub
        
If Not CheckToPath() Then Exit Sub

        
' Create an instance of the copy class that will be assigned to the first thread.
        Dim FileCopy As New CopyClass(Me)

        
' Set required properties
        FileCopy.FromPath = FromPathTextbox.Text
        
FileCopy.ToPath = ToPathTextbox.Text & _rootDir
        
FileCopy.StartDateTime = DateTime.Now

        
'Save log file name
        _logFile = FileCopy.LogFileName

        
' Create the thread and assign the class instance and method to execute 
        ' (CopyFiles in this case) when the thread is started.
        CopyThread = New Thread(AddressOf FileCopy.CopyFiles) '拷贝线程

        
' Start the first thread to copy the files.
        CopyThread.Name = "Copy"
        CopyThread.IsBackground 
= True
        CopyThread.Start()

        
' Create another instance of the copy class that will be assigned to the second thread.
        Dim FileFolderCount As New CopyClass(Me)

        
' Set required properties
        FileFolderCount.FromPath = FromPathTextbox.Text
        FileFolderCount.ToPath 
= ToPathTextbox.Text

        
' Create the thread and assign the class instance and method to execute 
        ' (CopyFiles in this case) when the thread is started.
        CountThread = New Thread(AddressOf FileFolderCount.GetCountData) '计数线程

        
' Start the second thread to count folders and files while the copy is running at the same time.
        CountThread.Name = "Count"
        CountThread.IsBackground 
= True
        CountThread.Start()

        
' Reset form controls
        StartCopy.Enabled = False
        Panel1.Enabled 
= False
        StopCopy.Enabled 
= True

    
End Sub

下面是终止两个线程的代码:

     Private   Sub StopCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopCopy.Click
        
'终止线程
        If CopyThread.IsAlive Then CopyThread.Abort()
        
If CountThread.IsAlive Then CountThread.Abort()
    
End Sub

主界面的两个delegate方法,用来响应子线程的回调,刷新主界面

     Public  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值