private void ProcessOCRQueueMessage(CloudQueueMessage queueMessage) { var messageContent = queueMessage.AsString; Trace.TraceInformation("Processing OCR queue message: " + messageContent); OCRQueueMessage ocrMessage = null; Exception exception = null; try { ocrMessage = OCRQueueMessage.Parse(messageContent); string imageFileName = SaveImageBlobToLocalFile(ocrMessage.ImageBlobName); string ocrTextFileName = PerformOCROnImageFile(imageFileName); string ocrBlobName = new FileInfo(ocrTextFileName).Name; CloudBlockBlob textBlob = StoreRecognizedTextAsBlob(ocrTextFileName, ocrBlobName); CreateEmailTask(ocrMessage.JobID, textBlob.Name, ocrMessage.RecipientEmail); DeleteInputImage(ocrMessage.ImageBlobName); DeleteTemporaryFiles(imageFileName, ocrTextFileName); } catch (Exception ex) { Trace.TraceError("An error occurred while processing OCR message. Details: " + ex); exception = ex; if (ocrMessage == null) { Trace.TraceError("Invalid message format. Deleting."); AzureQueues.OCRQueue.DeleteMessage(queueMessage); return; } } try { var job = AzureTables.OCRJobRepository.GetOCRJob(ocrMessage.JobID, ocrMessage.RecipientEmail); if (exception == null) { job.IsCompleted = true; job.ErrorMessage = null; AzureTables.OCRJobRepository.UpdateOCRJob(job); Trace.TraceInformation("Message (JobID = {0}) successfully processed, deleting.", ocrMessage.JobID); AzureQueues.OCRQueue.DeleteMessage(queueMessage); } else { job.IsCompleted = true; job.ErrorMessage = exception.ToString(); AzureTables.OCRJobRepository.UpdateOCRJob(job); } } catch (Exception ex) { Trace.TraceError("Failed to update job status: " + ex); } }