我正在创建一个应用程序,它在启动时(MainWindow
加载)启动BackgroundWorker
,DoWork
检查是否有更新版本的文件(自动完成框的DatasSource)可用。如果是这样,我下载并将其与现有文件合并并创建一个新文件。
现在我想在启动时以及定期(例如30分钟)这样做。所以我创建了一个threading.Timer [它是MainWindow类中的私有成员]并在backgroundWorker的RunWorkerCompleted
中初始化它(如上所述)。计时器成功进入回调,但在文件下载代码(只是一个fyi,一个不同的命名空间和不同的类),它只是终止,我无法弄清楚为什么?
我试过using Windows.Timers.Timer
,ThreadPool.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
答案 0 :(得分:0)
正如我在评论中指出的那样,这段代码有几个问题。
我认为您的主要问题是,当您创建文件时,您正在传递FileMode.CreateNew
,如果该文件已存在,则会失败。正如the documentation所说:
CreateNew指定操作系统应创建新文件。这需要FileIOPermissionAccess.Write权限。如果该文件已存在,则抛出IOException异常。
您可能想要FileMode.Create
。
所以会发生的事情是FileStream
构造函数抛出异常,导致DownloadFileCompleted
方法退出而不设置告诉调用者停止等待的事件。