在执行下一行代码之前,一行代码是否完成?

时间:2012-10-18 17:32:16

标签: vb.net visual-studio-2010

以下代码正在移动文件,只要该文件尚不存在即可。如果是,则不会移动文件。

我的问题是关于File.Move。 msgbox何时显示?文件完全移动后会显示,还是会在File.Move行执行后立即显示。

根据文件大小的不同,移动文件可能需要一段时间,因此我不希望在文件完全移动之前显示msgbox。

有更好的方法吗?

        For Each foundFile As String In My.Computer.FileSystem.GetFiles("C:\Temp\", FileIO.SearchOption.SearchAllSubDirectories, "*.zip")
            Dim foundFileInfo As New System.IO.FileInfo(foundFile)

            If My.Computer.FileSystem.FileExists("C:\Transfer\" & foundFileInfo.Name) Then
                Msgbox("File already exists and will not moved!")
                Exit Sub
            Else
                File.Move(foundFile, "C:\Transfer\" & foundFileInfo.Name)
                Msgbox("File has been moved!")
            End If
        Next

5 个答案:

答案 0 :(得分:5)

根据this sourceFile.Move调用是同步的,这意味着只有在文件移动后才会显示您的msgbox,无论其大小如何。

为了完整性,如果您不想阻止UI,可以尝试这样的事情:

' This must be placed outside your sub/function
Delegate Sub MoveDelegate(iSrc As String, iDest As String)

' This line and the following go inside your sub/function
Dim f As MoveDelegate = AddressOf File.Move

' Call File.Move asynchronously
f.BeginInvoke(
    foundFile, 
    "C:\Transfer\" & foundFile, 
    New AsyncCallback(Sub(r As IAsyncResult)
                          ' this code is executed when the move is complete
                          MsgBox("File has been moved!")
                      End Sub), Nothing)

或者您可以浏览新的async / await说明。

答案 1 :(得分:3)

File.Move是一个同步操作,因此在移动完成之前,应用程序不会执行下一行代码(您的消息框)。

正如您所指出的,如果文件很大(并且您正在跨驱动器移动),则在文件移动完成之前,消息框将不会显示。这会导致糟糕的用户体验,因为在此期间您的GUI似乎没有响应。

我建议花点时间学习如何利用后台线程或async / await调用来在后台执行操作。

关于MSDN上的异步IO有一篇很好的文章:http://msdn.microsoft.com/en-us/library/kztecsys.aspx

最后,您还可以使用FileSystem对象的MoveFile方法,如果您只是担心保持UI响应,可以为您弹出文件移动UI:

FileSystem.MoveFile(sourceFileName, destinationFileName, UIOption.AllDialogs)

答案 2 :(得分:2)

不幸的是,代码是一个接一个地执行的,因此只要文件已经完全移动,Msgbox就会弹出。

如果您想监控进度visit this link for more details

答案 3 :(得分:2)

无论文件大小如何,文件完全移动后都会显示消息框。

答案 4 :(得分:1)

除非方法是异步的,否则在继续下一行之前,一行代码将始终完成。

注意,如果文件移动速度很慢,并且它阻止你的程序是一件坏事,那么你可以使用例如BackgroundWorker在后台线程中进行移动。