vb.net 2005, проблема блокировки потоков, я думаю - PullRequest
0 голосов
/ 03 октября 2010

Я использую 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 Ответ

2 голосов
/ 03 октября 2010

Вы не закрываете файловый поток в случае исключения, которое может привести к блокировке. Убедитесь, что вы всегда располагаете одноразовыми ресурсами, заключив их в операторы 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 , который имеет такие методы, как DownloadFile и DownloadData , которые могут значительно облегчить вашу жизнь.

...