vb.net 2005,线程文件锁定问题,我想

时间:2010-10-03 07:50:37

标签: vb.net .net-2.0 thread-safety

我正在使用vb.net 2005,我有以下代码运行一个线程来下载文件。但是,尝试读取文件的本地副本时,有时会失败。我想我可能需要以某种方式解锁本地文件,但我不知道如何做到这一点。有人可以看看并建议我吗?

Dim BP1Ended As Boolean = False
Private Sub BackgroundProcess1()
    BP1Ended = False
    mPadFileStatus = DownloadFile(mstrPadUrl, mLocalFile)
    BP1Ended = True
End Sub

'---'
Dim t As System.Threading.Thread

t = New System.Threading.Thread(AddressOf BackgroundProcess1)
t.Start()

Dim ProcessStartTime As Date = Now()

Do While ProcessStartTime.AddMinutes(1) >= Date.Now 

Application.DoEvents()
If BP1Ended = True Then
    Exit Do
End If
Loop
t.Abort()

PadFileStatus = mPadFileStatus

If BP1Ended = False Then
    Application.DoEvents()
    AddConsoleMsg("Downloading file.... Aborted", True)
End If

'---'
Public Function DownloadFile(ByVal pstrRequestedFile As String, ByVal pstrDestinationFile As String, Optional ByVal TimeOut As Integer = 120) As DownloadStatus
Dim input As IO.Stream
Dim Req As System.Net.HttpWebRequest = Nothing
Dim Response As System.Net.HttpWebResponse

Try
    Req = System.Net.HttpWebRequest.Create(pstrRequestedFile)
Catch ex As Exception                       
    Return DownloadStatus.UnknownError
End Try

Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

Req.Timeout = TimeOut * 1000 '120 * 1000 '1 second = 1 000 milliseconds
Try
    Response = Req.GetResponse
    input = Response.GetResponseStream

    Dim streamreader As New StreamReader(input, System.Text.Encoding.GetEncoding("windows-1252")) 'System.Text.Encoding.UTF8)'
    Dim s_response As String = streamreader.ReadToEnd()
    streamreader.Close()

    Dim filestream As New FileStream(pstrDestinationFile, FileMode.Create)
    Dim streamwriter As New StreamWriter(filestream, System.Text.Encoding.GetEncoding("windows-1252")) ' System.Text.Encoding.UTF8)'
    streamwriter.Write(s_response)
    streamwriter.Flush()
    streamwriter.Close()

    Dim length As Long = 1000000 * 100
    Dim pos As Long = 0
    If Response.ContentLength > 0 Then
    length = Response.ContentLength
    End If

    If length > 0 Then
    Return DownloadStatus.OK
    End If

    input.Close()

Catch ew As System.Net.WebException

    If ew.Status = WebExceptionStatus.NameResolutionFailure Or ew.Status = WebExceptionStatus.ProtocolError Then
    Return DownloadStatus.FileNotFound
    ElseIf ew.Status <> WebExceptionStatus.Success Then
    Return DownloadStatus.UnknownError
    End If
    'Dim errorRespone As HttpWebResponse = CType(ew.Response, HttpWebResponse)
    'If errorRespone.StatusCode = HttpStatusCode.NotFound Then '404
    '    Return DownloadStatus.FileNotFound
    'Else
    '    Return DownloadStatus.UnknownError
    'End If'
Catch ex As Exception                                          'Don't know' 

    Return DownloadStatus.UnknownError
End Try

End Function

'---'
Dim OpenFile As FileStream
'OpenFile = New FileStream(pstrPadFile, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
'FAILS HERE
OpenFile = New FileStream(pstrPadFile, FileMode.Open, FileAccess.Read, FileShare.Read)

1 个答案:

答案 0 :(得分:2)

如果异常可能导致锁定,则不会关闭文件流。确保始终将可处理的资源包装在Using语句中

Using filestream As FileStream = New FileStream(pstrDestinationFile, FileMode.Create)
    Using streamwriter As StreamWriter = New StreamWriter(filestream, Encoding.GetEncoding("windows-1252"))
        streamwriter.Write(s_response)
    End Using
End Using

响应和响应流也是如此。它们应妥善处理。

另外,您可以考虑使用WebClient类,其中包含DownloadFileDownloadData等方法,可以让您的生活更轻松。