void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args) { // Clean up - remove from queue, set status UploadResult result = (UploadResult)args.Result; lock (batchUploadLock) { batchUploaders.Remove(result.ProcessId); } if (result.Status == UploadStatus.Processed) { // Dequeue queueManager.Dequeue(result.ProcessId, result.UserId); } else if (result.Status == UploadStatus.Failed) { // we can't throw an exception here as we are on a callback thread. But we have an error message. // put it in an error table for query String errorMessage = result.ErrorMessage; queueManager.AddErrorMessage(result.ProcessId, errorMessage, result.UserId); } else { // This should also catch cancelled events queueManager.UpdateQueue(result.ProcessId, result.Status, result.UserId); } }