liliang119007
民工_
采纳率50%
2018-06-13 07:38 阅读 5.5k

高并发访问同一个webservice 问题 怎么提高速度

20

有个客户接口 接受我推送过去的数据 ,所以我写了个循环进行价格推送。

因为数据量大 所以我写了多线程

foreach (var roomlist in hotelRoomInfoList)
{
// Thread.Sleep(10000);//每个线程间隙10秒
if (roomlist != null && roomlist.Count > 0)
{
//多线程
Thread thread = new Thread(new ParameterizedThreadStart(RoomInfoProcessThread));//创建线程
thread.Start(roomlist); //启动线程
}

}

         private void RoomInfoProcessThread(object obj_roomlist)
    {
                        foreach (var roomInfo in roomInfoList)
            {
                             _service.Request(roomInfo);
                        }
            }


            问题是反应速度 很慢  是不是windows什么地方限制了  
            每秒对外访问的次数有限?

            有没有大神有什么好的解决方法?



            已解决 :

            谢谢大家 

            加上 
            //最大连接数
    httpWebRequest.ServicePoint.ConnectionLimit = int.MaxValue;

            可恶的连接数默认值  限制了!默认同时只能请求2个 改了就好了!!
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

10条回答 默认 最新

  • wodexinhao wodexinhao 2018-06-13 08:08

    不知道你是否用的C#,如果是的话,看看你用的用的是哪个版本的.net , 有些版本是默认开启webservice 的web代理,第一次连接都会很慢,要关闭这个代理设置,HttpWebRequest.DefaultWebProxy = null; 或者是在配置文件中修改。具体怎么修改你自己去搜一下

    2。 采用线程池进行并发处理,不要sleep(10000),那是10秒钟,不慢才怪

    点赞 1 评论 复制链接分享
  • oBeiPiao12 oBeiPiao12 2018-06-13 07:42

    你每个线程都要停留10秒肯定会慢的啊。。然后你可以考虑下并行,百度下并行是怎么用的,推送的时候可以异步进行

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2018-06-13 07:43

    Thread.Sleep(10000);//每个线程间隙10秒
    这可不是间隙10秒,而是线程阻塞10秒啊,你这么搞能快么。。。汗

    点赞 评论 复制链接分享
  • dunite500 「已注销」 2018-06-13 07:43

    windwos也有socket文件句柄限制, 另外资源也是严重限制的, 例如你剩下内存500M, 那么产生的线程数是有限的, 如果满负荷运行, 线程上下文切换厉害, 最终把资源消耗完, 你的机器就卡死了.
    用jmeter做压力测试的时候, 能模拟的用户, 也就是线程数也不能无限大的, 否则卡死windows,只能断电重启. 还有一个就是对方的接口也有限度, 太多线程冲击会冲垮对方的系统的, 除非对方系统做了节流阀, 限制请求产生的速度

    点赞 评论 复制链接分享
  • skipple11 skipple11 2018-06-13 07:43

    用多个 service..负装载均衡

    点赞 评论 复制链接分享
  • dunite500 「已注销」 2018-06-13 07:49

    调用提高速度没用, 要服务端能承受得了. 就算服务端承受得了, 调用端也不能在短时间内产生大量请求线程

    点赞 评论 复制链接分享
  • wodexinhao wodexinhao 2018-06-13 07:54

    在应用程序的config文件中加入以下配置节:

    复制代码







    复制代码
    或者在程序入口加入以下代码:

    HttpWebRequest.DefaultWebProxy = null;

    如果是.net 4.0 尝试一下一下方法,然后再试试

    在配置文件中(.config)中添加配置节:

    [html] view plaincopyprint?
    <?xml version="1.0"?>











    enabled="false"
    useDefaultCredentials="false" >













    <?xml version="1.0"?>





    enabled="false"
    useDefaultCredentials="false" >






    【问题所在】

    点赞 评论 复制链接分享
  • wodexinhao wodexinhao 2018-06-13 07:57

    .net 4.0 在配置文件中(.config)中添加配置节:

    <?xml version="1.0"?>











    enabled="false"
    useDefaultCredentials="false" >











    其他版本,在应用程序的config文件中加入以下配置节






    或者在程序入口加入以下代码:
    HttpWebRequest.DefaultWebProxy = null;
    
    点赞 评论 复制链接分享
  • wodexinhao wodexinhao 2018-06-13 08:00

    还有你这种情况建议你用线程池,不需要sleep(10000),那是10秒钟在那里啊

    点赞 评论 复制链接分享
  • liliang119007 民工_ 2018-06-13 16:06

    谢谢大家 我已解决 加上这个就解决了!

    原来是可恶的连接数限制了 !!!!

    //最大连接数
    httpWebRequest.ServicePoint.ConnectionLimit = int.MaxValue;

    点赞 评论 复制链接分享

相关推荐