簡體   English   中英

為什么我的 TPL 數據流操作塊沒有並行執行?

[英]Why is my TPL Dataflow Actionblock not executing in parallell?

我正在嘗試並行執行一些 web 請求,但由於某種原因,它一個接一個地運行同步,我不知道為什么

代碼相當簡單,如下

 ConcurrentBag<string> documentsToImportInBatch = new ConcurrentBag<string>();

            var actionBlocHapiTest = new ActionBlock<Tuple<string, string>>(
                async request =>
            {
                var uriArticleTest = $"https://xxxx.com/omni-product"
                    + $"/api/v1/brands/0/articles/{request.Item1}?"
                    + $"channelIds=1&season={request.Item2}";
                var response = await staticHttpClient.GetAsync(uriArticleTest);
                var jsonString = await response.Content.ReadAsStringAsync();

                Article article = new Article
                {
                    Brand = brand,
                    UpdatedAt = DateTime.Now.ToString("s"),
                    Source = source,
                    ItemLevel = Enums.ItemLevel.Article,
                    DataType = Enums.DataType.DetailedItemInformation,
                    DetailedData = JObject.Parse(jsonString)
                };
                documentsToImportInBatch.Add(
                    Newtonsoft.Json.JsonConvert.SerializeObject(article));

            }, new ExecutionDataflowBlockOptions
            {
                MaxDegreeOfParallelism = 10
            });

            foreach (var itemTuple in articleAndSeasonList)
            {
                actionBlocHapiTest.Post(new Tuple<string, string>(
                    itemTuple.Item1, itemTuple.Item2));
            }
            actionBlocHapiTest.Complete();
            await actionBlocHapiTest.Completion;

我可以從性能監控中看到它每秒只執行 1 個左右的請求,而我預計它會更多。

為什么它沒有填充塊並用 10 個並行請求並行清空它?

解決了這個問題,在我的操作塊之前,我有一個 web 請求通過創建操作塊使用的列表進行分頁,它將一一提交給操作塊,而不是構建列表,然后將所有內容提交給操作塊,所以事實上該塊本身確實處理了它所擁有的所有內容,只是它當時只有一個條目,一旦我修復了它並將完整列表發送到它按預期工作並按預期並行處理的塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM