为了账号安全,请及时绑定邮箱和手机立即绑定

c#许多异步HttpWebRequest

c#许多异步HttpWebRequest

C#
潇潇雨雨 2022-01-16 15:37:58
我尝试制作许多 async HttpWebRequest。这是我的测试代码:class Program{    static void Main(string[] args)    {        Test();        Console.ReadLine();    }    public static async void Test()    {        for (int i = 0; i < 10; i++)        {            int val = i;            await Task.Run(() => WR(val));        }    }    static async void WR(int msg)    {        Console.WriteLine(msg + " begin");        string url = "https://stackoverflow.com";        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);        request.Method = "GET";        var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>                (request.BeginGetResponse, request.EndGetResponse, null);        Console.WriteLine(msg + " status code: " + response.StatusCode);        Console.WriteLine(msg + " end");    }}结果:0 begin1 begin2 begin3 begin4 begin5 begin6 begin7 begin8 begin9 begin0 status code: OK0 end1 status code: OK1 end然后1 end什么也没发生。在输出大约 30 秒后,我可以看到:The thread 0x6634 has exited with code 0 (0x0).The thread 0x5620 has exited with code 0 (0x0).The thread 0x4d08 has exited with code 0 (0x0).The thread 0x39b8 has exited with code 0 (0x0).The thread 0x3454 has exited with code 0 (0x0).The thread 0x99c has exited with code 0 (0x0).The thread 0x6be0 has exited with code 0 (0x0).但是没有任何例外,并且控制台没有关闭。我的错误在哪里?
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

不记得 response.Dispose();


static async void WR(int msg)

{

    Console.WriteLine(msg + " begin");


    string url = "https://stackoverflow.com";

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.Method = "GET";

    var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>

            (request.BeginGetResponse, request.EndGetResponse, null);


    Console.WriteLine(msg + " status code: " + response.StatusCode);

    Console.WriteLine(msg + " end");

    response.Dispose();

}


查看完整回答
反对 回复 2022-01-16
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

我已运行您的代码并获得如下输出:


0 begin

1 begin

2 begin

3 begin

4 begin

5 begin

6 begin

7 begin

8 begin

9 begin

0 status code: OK

0 end

5 status code: OK

5 end

8 status code: OK

8 end

4 status code: OK

4 end

3 status code: OK

3 end

2 status code: OK

2 end

6 status code: OK

6 end

1 status code: OK

1 end

7 status code: OK

7 end

9 status code: OK

9 end

当你按下回车键时,应用程序将因为Console.ReadLine();你的 main 方法而关闭。它等待程序直到从您的控制台获得输入。


查看完整回答
反对 回复 2022-01-16
?
动漫人物

TA贡献1815条经验 获得超10个赞

我会把它变成它自己的静态方法,它会返回一个字符串,这样你就可以看到发生了什么。我不会依赖任何类型的 xml 文件,除非它是从 API 调用返回的 XML。我在这里发帖,但如果你愿意,你可以得到。不确定您的设置在后端如何。核实:


public static string PostXMLDataCS()

    {

        bool debugging = false;

        try

        {


            string iConnectAuth = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +

  "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">" +

            "<soapenv:Header/>" +

       "<soapenv:Body>" +

        "<tem:Authenticate>" +

         "<!--Optional:-->" +

          "<tem:TenantID>TenantID</tem:TenantID>" +

               "<!--Optional:-->" +

                "<tem:Username>Username</tem:Username>" +

                     "<!--Optional:-->" +

                      "<tem:Password>password</tem:Password>" +

                           "</tem:Authenticate>" +

                            "</soapenv:Body>" +

                             "</soapenv:Envelope>";


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com/services/ByDesign/Inventory.svc");

            byte[] bytes;

            bytes = System.Text.Encoding.ASCII.GetBytes(iConnectAuth);


            request.ContentType = "text/xml; charset=utf-8";

            request.Accept = "gzip,deflate";

            request.ContentLength = bytes.Length;

            request.Method = "POST";

            request.Headers.Add("SOAPAction", "http://tempuri.org/IInventory/Authenticate");

            request.KeepAlive = true;


            Stream requestStream = request.GetRequestStream();

            requestStream.Write(bytes, 0, bytes.Length);

            requestStream.Close();

            HttpWebResponse response;

            response = (HttpWebResponse)request.GetResponse();

            if (response.StatusCode == HttpStatusCode.OK)

            {

                Stream responseStream = response.GetResponseStream();

                string responseStr = new StreamReader(responseStream).ReadToEnd();

                response.Close();

                //MessageBox.Show(responseStr);

                return responseStr;

            }

        }

        catch (Exception e)

        {

            if (debugging == true)

            {

                MessageBox.Show("There was a problem authenticating for the check inventory with iConnect. Error: " + e);

            }


            string messageSubject = "There was a problem authenticating for the check inventory with iConnect.";

            string messageBody = "There was a problem authenticating for the check inventory with iConnect. Error: ";

            string kiboSendEmail = string.Empty;

            SendEmail sendEmail = new SendEmail();

            return kiboSendEmail = sendEmail.SendEmailCS(messageSubject, messageBody, e);


        }

        return null;

    }


查看完整回答
反对 回复 2022-01-16
  • 3 回答
  • 0 关注
  • 525 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信