并发情况下异步调用延迟发送的情况

goto_code 2016-09-02 10:40:23
程序A是个webservice

[WebMethod]
public string HelloWorld(DateTime dt)
{
Thread.Sleep(5000);
return "Hello World";
}


程序B是调用A的winform

localhost.WebService1 es = new localhost.WebService1();
private void button1_Click(object sender, EventArgs e)
{
es.HelloWorldAsync(DateTime.Now);
}


这个调用,是没有问题的,很异步,很完美
但是,当并发起来的时候,比如,我开10个Timer,间隔10ms来执行

private void timer2_Tick(object sender, EventArgs e)
{
es.HelloWorldAsync(DateTime.Now);
}

此时,检测程序A发现,B发过来的请求,延迟收到,我故意用传参是datetime,来记录发送时间和接受时间,发现间隔很大。
然后我实际项目中,有时候会延迟到20分钟左右,所以,请教下,怎么样可以解决?
...全文
481 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
goto_code 2016-09-02
  • 打赏
  • 举报
回复
引用 10 楼 Forty2 的回复:
[quote=引用 5 楼 goto_code 的回复:] [quote=引用 2 楼 Forty2 的回复:] System.Net.ServicePointManager.DefaultConnectionLimit = 10;
请问这个写在哪里?[/quote] 在你的测试客户里(B)。 对同一个主机目标,Windows默认限定最多2个HTTP连接。你要放宽限制,才能多个请求并行。 [/quote] 我写在程序B了,但是没000而已啊什么效果,程序A依旧很晚才收到B的请求 好奇怪,按理说,A是webService,不是应该多实例的吗?为什么会卡了呢?我觉得我这个DEMO里,每个A都只是会延迟5秒而已啊。
goto_code 2016-09-02
  • 打赏
  • 举报
回复
引用 10 楼 Forty2 的回复:
[quote=引用 5 楼 goto_code 的回复:] [quote=引用 2 楼 Forty2 的回复:] System.Net.ServicePointManager.DefaultConnectionLimit = 10;
请问这个写在哪里?[/quote] 在你的测试客户里(B)。 对同一个主机目标,Windows默认限定最多2个HTTP连接。你要放宽限制,才能多个请求并行。 [/quote] System.Net.ServicePointManager.DefaultConnectionLimit = 10;那这个代码,写在哪里?A里?A是webservice,我想不出有什么地方可以做这个初始化啊
Forty2 2016-09-02
  • 打赏
  • 举报
回复
引用 5 楼 goto_code 的回复:
[quote=引用 2 楼 Forty2 的回复:] System.Net.ServicePointManager.DefaultConnectionLimit = 10;
请问这个写在哪里?[/quote] 在你的测试客户里(B)。 对同一个主机目标,Windows默认限定最多2个HTTP连接。你要放宽限制,才能多个请求并行。
goto_code 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 ling321602 的回复:
[quote=引用 6 楼 goto_code 的回复:] [quote=引用 1 楼 oysy 的回复:] Thread.Sleep(5000); 为何要用这个?
这个是测试demo用的,因为实际环境中,A程序的处理时间,大约需要2-5秒[/quote] 把并发调到1204, 但是你服务器端的处理时间不要超过1000ms,不然还是排队。 或者用负载均衡,用10个机器来处理或许可以[/quote] A这个webservice已经部署在负载均衡下了,好几个服务器在跑。我检测了,大约每次任务在2-5秒可以处理完。只是B的请求太多了,B本身就有大约1000个线程,每个线程都需要调用A
Randyling 2016-09-02
  • 打赏
  • 举报
回复
引用 7 楼 ling321602 的回复:
[quote=引用 6 楼 goto_code 的回复:] [quote=引用 1 楼 oysy 的回复:] Thread.Sleep(5000); 为何要用这个?
这个是测试demo用的,因为实际环境中,A程序的处理时间,大约需要2-5秒[/quote] 把连接数调到1204, 但是你服务器端的处理时间不要超过1000ms,不然还是排队。 或者用负载均衡,用10个机器来处理或许可以
Randyling 2016-09-02
  • 打赏
  • 举报
回复
引用 6 楼 goto_code 的回复:
[quote=引用 1 楼 oysy 的回复:] Thread.Sleep(5000); 为何要用这个?
这个是测试demo用的,因为实际环境中,A程序的处理时间,大约需要2-5秒[/quote] 把并发调到1204, 但是你服务器端的处理时间不要超过1000ms,不然还是排队。 或者用负载均衡,用10个机器来处理或许可以
goto_code 2016-09-02
  • 打赏
  • 举报
回复
引用 1 楼 oysy 的回复:
Thread.Sleep(5000); 为何要用这个?
这个是测试demo用的,因为实际环境中,A程序的处理时间,大约需要2-5秒
goto_code 2016-09-02
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
System.Net.ServicePointManager.DefaultConnectionLimit = 10;
请问这个写在哪里?A里?意思是限制A的输入队列,进行排队?那这样的话,不也是在延迟吗? 我想的吧,是1000个B调用到A,应该都会在sleep5000后得到返回才是。 因为A是webservice,B/S新请求,会创建新实例,不影响之前的堵塞吧 请指点
goto_code 2016-09-02
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
for(var i=0; i<10; i++) { es.HelloWorldAsync(DateTime.Now); } 是否瞬间立刻执行完毕?
B调用了HelloWorldAsync,自然可以在循环10次后,跳到下一行代码

 private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 10; i++)
                es.HelloWorldAsync(DateTime.Now);
            this.textBox1.Text = "ok";
        }
但是,A接收方,却延迟了。
  • 打赏
  • 举报
回复
for(var i=0; i<10; i++) { es.HelloWorldAsync(DateTime.Now); } 是否瞬间立刻执行完毕?
Forty2 2016-09-02
  • 打赏
  • 举报
回复
System.Net.ServicePointManager.DefaultConnectionLimit = 10;
飞天凤凰601 2016-09-02
  • 打赏
  • 举报
回复
Thread.Sleep(5000); 为何要用这个?

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧