예제 #1
0
        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();
            }
        }
예제 #2
0
        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();
        }