Threadwechsel beim BackgroundWorker ?

Hallo an die Experten,

ich habe einen BackgroundWorker angelegt, der Strings aus einer Queue verarbeitet und abspeichert.
Am Ende einer Anwendung muss ich wissen, ob die Queue leer ist und der BackgroundWorker fertig.
Leider tritt bei mir in ca. jedem 3. mal der Fall ein, dass der BackgroundWorker noch IsBusy() anzeigt, obwohl er eigentlich mit seiner Do_Work durch ist (ein bool am Anfang und Ende der Do_Work zeigt mir beim Debuggen genau an, ob er noch drinnen oder wieder draußen ist).
Ich kann dann nicht mit RunWorkerAsync() die vollständige Beendigung erzwingen. Ein Thread.Sleep(100) bringt auch nichts.

Erst wenn ich bspw. ein MessageBox.Show(…) aufrufe, wird das IsBusy zurückgenommen.

Woran kann das liegen und wie lass ich den Do_Work immer sauber beenden ?

Gruß
armstein