定期从网上下载文件

时间:2013-06-14 12:10:40

标签: vb.net

我正在创建一个应用程序,它在启动时(MainWindow加载)启动BackgroundWorkerDoWork检查是否有更新版本的文件(自动完成框的DatasSource)可用。如果是这样,我下载并将其与现有文件合并并创建一个新文件。

现在我想在启动时以及定期(例如30分钟)这样做。所以我创建了一个threading.Timer [它是MainWindow类中的私有成员]并在backgroundWorker的RunWorkerCompleted中初始化它(如上所述)。计时器成功进入回调,但在文件下载代码(只是一个fyi,一个不同的命名空间和不同的类),它只是终止,我无法弄清楚为什么?

我试过using Windows.Timers.TimerThreadPool.RegisterWaitForSingleObject()但没有运气......

有人能指出我正确的方向吗?我愿意接受任何解决方案。

下载代码:

Public Sub MergeHistoryFile()
  /*Check the directory if there are any downloaded files(.tmp);if there are;just   delete them*/
 /*some code which checks if file on web is modified;if yes download file*/ 
Try 
  Dim waiter As Threading.AutoResetEvent = New AutoResetEvent(False)
  _downloader = New WebClient()
  AddHandler _downloader.DownloadDataCompleted, AddressOf Me.DownloaderFileCompleted
  _downloader.DownloadDataAsync(New Uri(path_file), waiter)
  waiter.WaitOne() 
Catch ex As Exception 
  Throw ex 
End Try

/*some more code which checks if there something new in the downloaded file;if yes merge the local and the downloaded file reinitialize the autocomplebox*/
End Sub

Private _downloadCancelled As Boolean = False
Private Sub DownloaderFileCompleted(ByVal sender As Object, ByVal e As System.Net.DownloadDataCompletedEventArgs)
    If IsNothing(e.Error) Then
        If Not (IsNothing(e.Result)) Then
            Using fs As New FileStream(Path.Combine(HistoryPath, "_tempDownladedFile.tmp"), FileMode.CreateNew)
                fs.Write(e.Result, 0, e.Result.Count)
            End Using
            CType(e.UserState, Threading.AutoResetEvent).Set()
        End If
    Else
        _downloadCancelled = True
        _downloader.CancelAsync()
    End If
End Sub

1 个答案:

答案 0 :(得分:0)

正如我在评论中指出的那样,这段代码有几个问题。

我认为您的主要问题是,当您创建文件时,您正在传递FileMode.CreateNew,如果该文件已存在,则会失败。正如the documentation所说:

  

CreateNew指定操作系统应创建新文件。这需要FileIOPermissionAccess.Write权限。如果该文件已存在,则抛出IOException异常。

您可能想要FileMode.Create

所以会发生的事情是FileStream构造函数抛出异常,导致DownloadFileCompleted方法退出而不设置告诉调用者停止等待的事件。