我有一个主要的UI,有很长的处理任务。我使用来自Web服务器的信息更新了几百个数据库。数据库存储在存储库中,需要下载,然后更新,然后上载(重新登录)到存储库。
我并不关心工作的长度,但我已经实现了一个后台工作线程来处理上传,以便下一个文件可以开始处理。该过程的每个步骤都会记录到几个不同的XML日志文件中,以便以后分析每个文件中更新的内容。工作得很好,直到......
我的问题是,在我循环之前,我调用运行异步后台工作程序来处理上传,在最后一个文件之前工作得很好。我已经尝试了十几种不同的技术来阻止,IsBusy,join,sleep等主线程,以便在我可以关闭我的XML编写器之前等待只上传最后一个文件,并确认所有文件正确上传。
我还尝试实现RunWorkerCompleted,它可以启动,但只有在返回主线程后,所以即使我设置了一个标志或为事件的最后一个条件添加逻辑,我也会遇到“使用中”错误在我的XML编写器上。因为我认为它已经完成更新,所以无法想出那一个。
我可以发布所需的任何代码。在这一点上它有点意大利面,我想我可以使用一些帮助,方向,例子,如何阻止我的循环的最后一个记录上的主线程,所以我可以允许最终上传完成。我真的不喜欢只是添加睡眠,因为它看起来效率太低而且在实际处理完成后并没有真正响应。
vb.net
主要用户界面
connect_to_access_db.rb
require 'win32ole'
connection = WIN32OLE.new('ADODB.Connection')
connection.Open('Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=c:\path\filename.accdb')
SQLstatement = "SELECT * FROM TABLE"
recordset = WIN32OLE.new('ADODB.Recordset')
res = recordset.Open(SQLstatement, connection)
p res
在TestWorker_RunWorkerCompleted
之前触发For
' Processing ....
returnFiletoSS()
fileCountChker = fileCountChker + 1
Next
myXmlTextWriter.WriteEndElement()
myXmlTextWriter.Close()
myXmlTextWriter1.WriteEndElement()
myXmlTextWriter1.Close()
objWriter.Close()
' Prior test logic
' ''If fileCountChker = numOfFiles Then
' '' While TestWorker.IsBusy
' '' Threading.Thread.Sleep(400)
' '' End While
调用此函数......
If lastRecord Then
objWriter1.Close()
Else
While lastRecord <> True
Threading.Thread.Sleep(400)
End While
objWriter1.Close()
End If