Not sure if the OP is still in need of a solution judging from what replies he got - nothing of value - and the date this question was posted.
I have a similar situation while sending an email with attachments. I use a single Timer control to manage the "firing" order of my Backgroundworker with the 2 conditions that must be met before the next Backgroundworker will fire, these are (1) a Label control to confirm that the previous action has successfully completed and (2) that the previous Backgroundworker has ended - you don't want two backgroundworkers to run at the same time, especially when the one is dependent on the work done by the other.
When sending an email with attachments (images from a DB) this is how my workflow for:
(1) Retrieve images (binary format) from DB into memory stream. Save the memorystream to a file on the local disk.
(2) Prepare and send email with attachments.
(3) Remove images from file system.
During the process I update a Label and a Progressbar.
This is the logic behind using 3 Backgroundworkers with a single Timer control:
Private Sub tmrBackgroundworker_Tick(sender As System.Object, e As System.EventArgs) Handles tmrBackgroundworker.Tick
If bgwExportImage.IsBusy = False AndAlso Me.tsSendMailStatus.Text = "Preparing Email message" Then
bgwExportImage.RunWorkerAsync()
ElseIf bgwSendMessage.IsBusy = False AndAlso Me.tsSendMailStatus.Text = "Export completed" Then
bgwSendMessage.RunWorkerAsync()
ElseIf bgwDeleteImages.IsBusy = False AndAlso Me.tsSendMailStatus.Text = "Message sent" Then
bgwDeleteImages.RunWorkerAsync()
End If
End Sub
I hope this helps you out a little. It works really well for me and has been working perfectly for some time now and I haven't has a single instance where it failed on me.
Something to keep in mind is to first test if any backgroundworkers are running before you attempt to fire your first backgroundworker.