【发布时间】:2020-06-02 12:54:52
【问题描述】:
我在尝试使用 BackgroundWorker 来更新我的主表单 UI 以响应 FileSystemWatcher 事件被触发时有点卡住了。
- FileSystemWatcher 检查添加到特定文件夹的图像,触发 OnCreated 处理程序
- OnCreated 处理程序调用 RunWorkerAsync(e.FullPath) 将文件名传递给后台工作人员
- 后台工作人员 RunWorkerAsync 获取文件路径,并将项目添加到 List(Of Product)
- List(Of Product) 被添加到主 UI 上的 ListBox 控件中
我的第一个问题是在后台工作人员完成后更新主 UI 线程。我在后台工作人员中处理图像,因为从图像生成缩略图需要几秒钟,并且不想锁定 UI。
我遇到的第二个问题是,在我的事件第二次触发后,后台工作人员正忙时抛出异常。
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
- 如何在 BackgroundWorker 将项目添加到列表后更新 CheckedListBoxView 控件而不会发生非法跨线程调用?
- 如果在工作人员完成之前引发另一个文件事件,我如何检查工作人员是否忙?
【问题讨论】:
-
您明确提出了两个不同的问题,这明显违反了规则。如果您有两个问题,请创建两个问题。除非一个人同时解决两个问题,否则您几乎无法接受两个单独问题的单一答案。请遵守规则。
-
第二个问题似乎没有任何意义。