这是我在线程下运行的示例代码,用于从ftp服务器下载文件。在那,如果用户想要停止文件下载,我试图中止该线程。如果在while循环中控件,则挂起。
How to close the binaryreader and Stream, when reader in the middle of stream
Using response As FtpWebResponse = CType(ftp.GetResponse, FtpWebResponse)
Using input As Stream = response.GetResponseStream()
Using reader As New BinaryReader(input)
Try
Using writer As New BinaryWriter(File.Open(targetFI.FullName, FileMode.Create)) 'output)
Dim buffer(2048) As Byte '= New Byte(2048)
Dim count As Integer = reader.Read(buffer, 0, buffer.Length)
While count <> 0
writer.Write(buffer, 0, count)
count = reader.Read(buffer, 0, buffer.Length)
End While
writer.Close()
End Using
Catch ex As Exception
'catch error and delete file only partially downloaded
targetFI.Delete()
'Throw
ret = False
End Try
reader.Close()
End Using
input.Close()
End Using
response.Close()
End Using
答案 0 :(得分:1)
您需要在While
循环中添加“轮询”以检查某个条件(在您的情况下,用户是否希望中止下载)是否为真。如果条件为真,则可以退出while循环。
例如,您可能会在用户希望停止下载时调用一个函数(这可能是为了响应用户界面上的Button单击或某些此类机制)。
使用类级别布尔变量(或属性),您可以简单地将此变量设置为true以响应希望中止下载的用户,然后在您的while
循环中将读取文件的部分内容FTP响应流,您检查此变量的值,如果它是true
,您只需退出while
循环:
例如:
在班级某处,您声明:
Dim blnAbort as Boolean = False
当用户(例如)单击按钮中止下载时:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
blnAbort = True
End Sub
在问题代码的主要While循环中,添加:
While count <> 0
' Check the value of the blnAbort variable. If it is true, the user wants to abort, so we exit out of our while loop'
If blnAbort = True Then
Exit While
End If
writer.Write(buffer, 0, count)
count = reader.Read(buffer, 0, buffer.Length)
End While
这是您应该中止长时间运行过程的基本机制(polling)。当然,您应该始终确保在中止的情况下执行相关的清理代码(在您的情况下,关闭您正在执行的读取器和写入器)。如果在基于Windows窗体的应用程序的上下文中完成此操作,您可能还需要在while
循环中调用Application.DoEvents
,并且用户中止由一些GUI交互之王控制。这将确保(例如)按钮单击生成的Windows消息得到及时处理。