Vb.net 使用BackgroundWorker使用FileSystemWatcher更新主窗体UI?
我在尝试使用BackgroundWorker更新我的主窗体UI以响应被触发的FileSystemWatcher事件时遇到了一些麻烦Vb.net 使用BackgroundWorker使用FileSystemWatcher更新主窗体UI?,vb.net,winforms,Vb.net,Winforms,我在尝试使用BackgroundWorker更新我的主窗体UI以响应被触发的FileSystemWatcher事件时遇到了一些麻烦 FileSystemWatcher检查要添加到特定文件夹的映像,激发OnCreated处理程序 OnCreated处理程序调用RunWorkerAsync(e.FullPath)将文件名传递给后台工作程序 后台工作程序RunWorkerAsync获取文件路径,并将该项添加到(产品)列表中 列表(产品)添加到主UI上的ListBox控件中 我的第一个问题是在后台工作程
Private HoldingTank As New List(Of Product)
Private Sub LoadImages()
Me.ToolStripStatusLabelUpdate.Text = "Images Loading - Please Wait...."
CheckedListBoxView.Items.Clear()
HoldingTank = Me.CreateImageList()
For Each product As Product In HoldingTank
Me.CheckedListBoxView.Items.Add(New ListViewDataItem With {.Image = product.Image, .ImageAlignment = ContentAlignment.MiddleCenter, .Tag = product})
Next
Me.ToolStripStatusLabelUpdate.Text = "Ready"
End Sub
Public Sub WatchFolders()
watcher.Path = PathImport
watcher.Filter = "*.tif"
AddHandler watcher.Created, AddressOf OnCreated
watcher.EnableRaisingEvents = True
End Sub
Sub OnCreated(sender As Object, e As IO.FileSystemEventArgs)
BackgroundWorker1.RunWorkerAsync(e.FullPath)
End Sub
Private Sub BackgroundWorker1_LoadImages(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
HoldingTank.Add(New Product() With {.FileName = path.getFileName(e.argument), .FileExtension = path.GetExtension(e.argument), .FileFullPath = e.argument, .Image = GenerateThumbnail(e.argument)})
'// Function GenerateThumbnail returns an Image object
End Sub
首先,确保您已经设置了
FileSystemwatcher
的SynchronizingObject
属性。如果没有,它将在次线程上引发其事件,在本例中您不希望这样做。您应该将表单指定给该属性
其次,在DoWork
事件处理程序中,您不需要触摸UI或从中调用的任何方法。这都是在辅助线程上执行的,除了UI线程之外,您不能在任何线程上修改UI。您可以在DoWork
事件处理程序中完成所有可以完成的工作,然后将结果数据分配给e.Result
属性
然后处理在UI线程上执行的RunWorkerCompleted
事件,从e.Result
属性获取数据,然后更新UI。我不知道您在那里使用的是什么控件,但是您应该能够在辅助线程上创建项,但是您需要将它们添加到UI线程上的控件中
您可以找到我自己的
BackgroundWorker
示例。首先,请确保已设置FileSystemwatcher
的SynchronizingObject
属性。如果没有,它将在次线程上引发其事件,在本例中您不希望这样做。您应该将表单指定给该属性
其次,在DoWork
事件处理程序中,您不需要触摸UI或从中调用的任何方法。这都是在辅助线程上执行的,除了UI线程之外,您不能在任何线程上修改UI。您可以在DoWork
事件处理程序中完成所有可以完成的工作,然后将结果数据分配给e.Result
属性
然后处理在UI线程上执行的RunWorkerCompleted
事件,从e.Result
属性获取数据,然后更新UI。我不知道您在那里使用的是什么控件,但是您应该能够在辅助线程上创建项,但是您需要将它们添加到UI线程上的控件中
您可以找到我自己的
BackgroundWorker
示例。您明确提出了两个不同的问题,这显然违反了规则。如果您有两个问题,请创建两个问题。除非一个人同时回答两个问题,否则你很难接受两个问题的单一答案。请遵守规则。第二个问题似乎没有任何意义。你明确提出了两个不同的问题,这显然违反了规则。如果您有两个问题,请创建两个问题。除非一个人同时回答两个问题,否则你很难接受两个问题的单一答案。请遵循规则。第二个问题似乎没有任何意义。错误消息为PHP的VbForums用户警告:fetch_template()调用应替换为vB_template类。模板名称:bbcode_突出显示在..../includes/functions.php第4197行
。这显示了对论坛所涉及的技术的信心:)@AndrewMorton,他们有一个自定义的vBulletin加载项,为每次升级站点软件时都需要手动注意的代码片段提供语法高亮显示,而最新的vBulletin更新由于某些不兼容而导致了这一点。网站管理员一再将这个问题推到最高层,但网站所有者似乎不愿意解决它。除了帖子中带有highlight
标记的页面显示这些错误,并且包含这些标记的帖子尝试提交两次之外,其他一切似乎都运行得很好。错误消息为PHP的VbForums用户警告:fetch_template()调用应替换为vB_template类。模板名称:bbcode_突出显示在..../includes/functions.php第4197行
。这显示了对论坛所涉及的技术的信心:)@AndrewMorton,他们有一个自定义的vBulletin加载项,为每次升级站点软件时都需要手动注意的代码片段提供语法高亮显示,而最新的vBulletin更新由于某些不兼容而导致了这一点。网站管理员一再将这个问题推到最高层,但网站所有者似乎不愿意解决它。除了帖子中带有突出显示
标记的页面显示这些错误,以及包含这些标记的帖子尝试提交两次之外,其他一切似乎都很好。