public static async Task CreateAndUseNewAsyncBlock(int?maximumDegreeOfParallelism, int maximumNumberOfActionsInQueue, Func <IAsyncProcDataflowBlock, Task> action) { var node = new AsyncProcDataflowBlock(maximumNumberOfActionsInQueue, maximumDegreeOfParallelism); node.Start(); try { await action(node); } finally { node.Stop(); } }
public void ProcessDocumentsUsingProceduralDataflow() { var readDocumentsBlock = ProcDataflowBlock.StartDefault( maximumNumberOfActionsInQueue: 100, maximumDegreeOfParallelism: 1); var spanishDocumentsTranslationBlock = ProcDataflowBlock.StartDefault( maximumNumberOfActionsInQueue: 10, maximumDegreeOfParallelism: 1); var germanDocumentsTranslationBlock = AsyncProcDataflowBlock.StartDefault( maximumNumberOfActionsInQueue: 100, maximumDegreeOfParallelism: 1); var saveDocumentsBlock = ProcDataflowBlock.StartDefault( maximumNumberOfActionsInQueue: 100, maximumDegreeOfParallelism: 1); DfTask <Document> DfReadDocumentFromSourceStore( string documentId) => readDocumentsBlock.Run( () => ReadDocumentFromSourceStore(documentId)); DfTask <Document> DfTranslateSpanishDocument( Document document, Language destinationLanguage) => spanishDocumentsTranslationBlock.Run( () => TranslateSpanishDocument(document, destinationLanguage)); DfTask <Document> DfTranslateGermanDocument( Document document, Language destinationLanguage) => germanDocumentsTranslationBlock.Run( () => TranslateGermanDocumentAsync(document, destinationLanguage)); DfTask DfSaveDocumentToDestinationStore( Document document) => saveDocumentsBlock.Run( () => SaveDocumentToDestinationStore(document)); async Task ProcessDocument(string documentId) { var document = await DfReadDocumentFromSourceStore(documentId); var language = GetDocumentLanguage(document); Document translatedDocument; if (language == Language.Spanish) { translatedDocument = await DfTranslateSpanishDocument(document, Language.English); } else // if (language == Language.German) { translatedDocument = await DfTranslateGermanDocument(document, Language.English); } await DfSaveDocumentToDestinationStore(translatedDocument); } string[] documentIds = GetDocumentIdsToProcess(); var processingTask = EnumerableProcessor.ProcessEnumerable( documentIds, documentId => ProcessDocument(documentId), maximumNumberOfNotCompletedTasks: 100); processingTask.Wait(); }