C#httpclient在最后一个请求时挂起

时间:2014-12-18 08:10:37

标签: c# request httpclient hang

我有一个程序可以向服务器发送几千个帖子请求。一切正常,直到传输结束。除了一个请求之外,所有程序都会挂起。

总是只剩下一个请求。我正在使用HttpClient,一切都是异步完成的。 在这里,我创建了httpclient:

ServicePointManager.ServerCertificateValidationCallback += 
                        (sender, cert, chain, sslPolicyErrors) => true;

ServicePointManager.DefaultConnectionLimit = 45;
ServicePointManager.Expect100Continue = false;

var CurrentCredentials = new System.Net.NetworkCredential(Repo.Username, Repo.Password);

var Handler = new HttpClientHandler
{
    Credentials = CurrentCredentials,
    ClientCertificateOptions = ClientCertificateOption.Automatic,
    UseProxy = false,
};

var Client = new HttpClient(Handler);

Client.Timeout = TimeSpan.FromSeconds(2500);
Client.DefaultRequestHeaders.Add("Connection", "Keep-alive");

WebServ = new WebService(Client, ref Repo);

以下是我发送请求的地方:

private async Task<string> SendData(string Url, HttpContent[] content, string[] name)
{
    using (var FormData = new MultipartFormDataContent())
    {
        for (int i = 0; i < content.Length; ++i)
        {
            if (name[i] == "file")
                FormData.Add(content[i], name[i], name[i] + i.ToString() + ".jpg");
            else
                FormData.Add(content[i], name[i]);
        }

        try
        {
            using (var Response = await Client
                                    .PostAsync(Url, FormData)
                                    .ConfigureAwait(continueOnCapturedContext:false))
            {
                await App.Current.Dispatcher.BeginInvoke(
                           (Action)delegate
                           {
                               Repo.CurrentItem++;
                           });

                using (var StreamResume = new StreamWriter("resume.bkp"))
                {
                    await StreamResume.WriteLineAsync(Repo.CurrentItem.ToString());
                }

                if (Response.IsSuccessStatusCode)
                {
                    await App.Current.Dispatcher.BeginInvoke(
                              (Action)delegate
                              {
                                  Repo.Log.Add(Url + " OK" + Repo.CurrentItem);
                              });
                }
                else
                {
                    await App.Current.Dispatcher.BeginInvoke(
                              (Action)delegate
                              {
                                  Repo.Log.Add(Url + " Error " 
                                              + Response.Content.ToString());
                              });
                }

                if (Repo.CurrentItem == Repo.NumberOfItems)
                {
                    await App.Current.Dispatcher.BeginInvoke(
                             (Action)delegate
                              {
                                  Repo.Log.Add("Data has been imported");
                                  Repo.CurrentState = "Finished!";

                                  Repo.CurrentItem = 0;
                                  Repo.Uploading = false;
                                  Repo.NotUploading = true;
                                  Repo.Resumable = false;

                                  File.Delete("resume.bkp");
                              });
                }
            }

            return null;
        }
        catch (OperationCanceledException)
        {
        }
        catch (InvalidOperationException)
        {
            App.Current.Dispatcher.Invoke(
                 (Action)delegate
                 {
                     Repo.Log.Add("The url is not valid");
                     Repo.CurrentItem = 0;
                 });

            Client.CancelPendingRequests();
        }
        return null;
    }
}

我没有遇到任何错误,只是某些线程永远不会退出,程序永远不会终止。如果我有一个较小的数据集,只有大约180个请求,程序就完成了从不挂起的工作。在此先感谢您的帮助

0 个答案:

没有答案