在运行少量任务后,多个带有Task的HttpClient GetAsync请求始终返回“任务已取消”

时间:2019-06-30 01:33:48

标签: c# winforms

我正尝试发送多个HttpClient GetAsync请求,以加快检查功能的工作速度。刚开始,我尝试使用Parallel,但是并行似乎立即向与CPU绑定的线程工作人员发送了整个请求(任务?),我不喜欢它,而且它返回TaskCancellationExcption,因为它们无法使任务排队快速(这也是我的假设。很明显,经过几次处理后,它会返回TaskCancellationException)

基本上,有一个用于用户输入的静态字符串列表(gVar.Tags.Name)。用户输入的HttpCheck函数处理列表,以检查它们是否有效。一共有3种情况需要结帐。

所以我用C + P回答了StackOverflow,建议使用Task而不是Parallel。 最初,它似乎运行良好,但是经过Tasks的某些处理后,它突然增加了CPU使用率,并停止工作,最后返回TaskCancellationException,其中InnerException为空。

这是如此难以调试,也很难理解为什么在两种情况下都失败。至少并行地,我可以从逻辑上假设失败的原因,但未能对此做出解决。 但是在Task中,我不知道为什么它会失败。

 private async void Validate_Click(object sender, EventArgs e)
        {
            progressBar1.Minimum = 0;
            progressBar1.Maximum = gVar.Tags.Count * 3;
            progressBar1.Value = 0;
            await HttpChk.ChkAllTag(progressBar1);
        }

 public static async Task ChkAllTag(ProgressBar pb)
    {
        System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
        Client.DefaultRequestHeaders.ConnectionClose = true;

        var tasks = gVar.Tags.Select(tag =>
        {
            var requests = new List<Task>();
            for (int i = 1; i < 4; i++)
            {
                switch (i)
                {
                    case 1:
                        prefix = Decrypt("8gJgvHYN8PQ=");
                        break;

                    case 2:
                        prefix = Decrypt("S14xSO/IN1o=");
                        break;

                    case 3:
                        prefix = Decrypt("MRn6R3llViU=");
                        break;
                }
                requests.Add(SendReq(Client, pb, tag, i));
            }
            return requests;
        }).SelectMany(t => t);

        await Task.WhenAll(tasks);
    }

    public async static Task SendReq(HttpClient Client, ProgressBar pb, Tag tag, int i)
    {
        using (var response = await Client.GetAsync(Decrypt("5z3TRN6W97CdqvLdcRKpsG66rFK34YzA") + prefix + tag.Name.ToLower() + suffix, HttpCompletionOption.ResponseHeadersRead))
        {
            Console.WriteLine("Checking sequence number " + i + " With index number " + tag.TagCount + " Result:" + (int)response.StatusCode);
            pb.Invoke(new MethodInvoker(delegate
            {
                pb.Value++;
            }));
            if (response.StatusCode != HttpStatusCode.NotFound)
            {
                hitcnt++;
                switch (i)
                {
                    case 1:
                        tag.Type.A = true;
                        break;

                    case 2:
                        tag.Type.B = true;
                        break;

                    case 3:
                        tag.Type.C = true;
                        break;
                }
            }
            Console.WriteLine("Successful Hits : " + hitcnt);
        }
    }
}

0 个答案:

没有答案