首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CancellationTokenSource高Cpu使用率

CancellationTokenSource高Cpu使用率
EN

Stack Overflow用户
提问于 2019-09-08 15:00:59
回答 1查看 243关注 0票数 0

我正在尝试取消我的任务,但它创建了高cpu使用率。我的cpu使用率达到100%

我在互联网上尝试了不同的代码,所有的代码都给出了相同的输出。

起始码

代码语言:javascript
复制
private async void BtnStart_Click(object sender, EventArgs e)
        {
            cts = new CancellationTokenSource();
            btnStart.Enabled = false;
            btnStop.Enabled = true;
            btnExport.Enabled = false;
            btnOpen.Enabled = false;
            btnClear.Enabled = false;
            totalLinesCount = listBox_domains.Items.Count;
            List<string> urls = new List<string>();
            for (int i = 0; i < listBox_domains.Items.Count; i++)
            {
                urls.Add(listBox_domains.Items[i].ToString());
            }
            if (textBox_Proxies.Text != null)
            {
                for (int i = 0; i < textBox_Proxies.Lines.Length; i++)
                {
                    proxyList.Add(textBox_Proxies.Lines[i]);
                }
            }
            var maxThreads = (int)numericUpDown1.Value;
            var q = new ConcurrentQueue<string>(urls);
            tasks = new List<Task>();
            for (int n = 0; n < maxThreads; n++)
            {
                tasks.Add(Task.Run(async () =>
                {
                    while (q.TryDequeue(out string url))
                    {
                        await SendHttpRequestAsync(url, cts.Token);
                        Thread.Sleep(100);
                    }
                }));
            }
            await Task.WhenAll(tasks).ContinueWith((FinalWork) =>
            {
                btnStart.Enabled = true;
                btnExport.Enabled = true;
                btnOpen.Enabled = true;
                btnClear.Enabled = true;
                MessageBox.Show(new Form { TopMost = true }, "Completed!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            }, TaskContinuationOptions.OnlyOnRanToCompletion);

        }

主要任务

代码语言:javascript
复制
private async Task SendHttpRequestAsync(string url, CancellationToken ct)
        {
            var httpClientHandler = new HttpClientHandler
            {
                Proxy = new WebProxy(GetProxy(), false),
                UseProxy = true
            };
            try
            {
                using (HttpClient client = new HttpClient(httpClientHandler))
                {
                    client.Timeout = TimeSpan.FromMilliseconds(1000 * (int)numericUpDown_timeout.Value); //adjust based on your network
                    //var byteArray = Encoding.ASCII.GetBytes("username:password1234");
                    //client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
                    try
                    {
                        using (HttpResponseMessage response = await client.GetAsync("URL" + url, ct))
                        {
                            using (HttpContent content = response.Content)
                            {
                                string result = await content.ReadAsStringAsync();
                                Regex match = new Regex(regex, RegexOptions.Singleline);
                                MatchCollection collection = Regex.Matches(result, regex);
                                try
                                {
                                    await AddDataToDgv(url, collection[0].ToString(), collection[1].ToString(), collection[2].ToString());
                                }
                                catch (Exception ex)
                                {
                                    await AddDataToDgv(url, "error", "error", "error");
                                }
                            }
                        }
                    }catch(Exception ex)
                    {
                        await SendHttpRequestAsync(url, ct);
                        retries++;
                        if (retries > (int)numericUpDown_Retries.Value)
                        {
                            retries = 1;
                            await AddDataToDgv(url, "timeout", "timeout", "timeout");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

停止代码

代码语言:javascript
复制
private void BtnStop_Click(object sender, EventArgs e)
        {

            if (cts != null)
            {
                cts.Cancel();
                btnStart.Enabled = true;
                btnStop.Enabled = false;
                btnExport.Enabled = true;
                btnOpen.Enabled = true;
                btnClear.Enabled = true;
                MessageBox.Show(new Form { TopMost = true }, "Cancelled!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

WHen单击停止任务正在停止,但生成高cpu使用率为100%。

尝试过的示例:https://binary-studio.com/2015/10/23/task-cancellation-in-c-and-things-you-should-know-about-it/ https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation

EN

回答 1

Stack Overflow用户

发布于 2019-09-08 17:21:55

client.GetAsync被取消时,它抛出一个TaskCanceledException。在这种情况下,您不想重试。此外,不要在async SendHttpRequestAsync中显示MessageBoxes。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57839819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档