.net core异步线程

Liu_LY95 2018-04-28 11:22:26
问题简述:前端页面之后,有三个ajax的异步请求到后台,单独每个请求,返回给前端的时间是在500ms以内,三个同时请求,请求到返回最长时间为2s左右,我想这个问题大概是出在了后端

$(function () {
//控件初始化完成后
bindA();
bindB();
bindC();
})
function bindA() {
$.ajax({
type: 'post',
async: true,
url: 'Home/GetDateA',
dataType: 'json',
success: function (result) {

},
error: function () {

}
});
}
function bindB() {
$.ajax({
type: 'post',
async: true,
url: 'Home/GetDateB',
dataType: 'json',
success: function (result) {

},
error: function () {

}
});
}
function bindC() {
$.ajax({
type: 'post',
async: true,
url: 'Home/GetDateC',
dataType: 'json',
success: function (result) {

},
error: function () {

}
});
}


后台代码

public async Task<IActionResult> GetDateA()
{
var dateA= await _service.GetDateA();
log.Error("线程:" + Thread.CurrentThread.ManagedThreadId + ";名称:GetDateA");
return Json(dateA);
}
public async Task<IActionResult> GetDateB()
{
var dateB= await _service.GetDateB();
log.Error("线程:" + Thread.CurrentThread.ManagedThreadId + ";名称:GetDateB");
return Json(dateB);
}
public async Task<IActionResult> GetDateC()
{
var dateC= await _service.GetDateC();
log.Error("线程:" + Thread.CurrentThread.ManagedThreadId + ";名称:GetDateC");
return Json(dateC);
}

单独函数,后台请求相应时间也是500ms左右,如果三个同时请求,最长返回2s左右,这个问题是出在了数据库查询,还是说在后台处理。
三个同时请求,日志
线程:8;名称:GetDateA
线程:16;名称:GetDateB
线程:11;名称:GetDateC
是不同的线程去处理



...全文
1276 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒙奇·D·代码 2019-10-18
  • 打赏
  • 举报
回复
Liu_LY95 2018-05-02
  • 打赏
  • 举报
回复
[quote=引用 6 楼 testplusplus 的回复:] 1.尝试把后端里的log.Error语句注释掉,看看前端显示三个调用是多少时间。如果日志是磁盘I/O耗时也挺可观 2.可进一步把_service的几个异步调用的方法,换成await Task.Delay(500)来替代模拟一下异步,看看前端显示三个调用是多少时间。旁观者不知道你的GetDateXX方法内部会不会出并发幺蛾子。[/quote] 将GETDATE() 替换为await Task.Delay(500),并返回空的JSON字符串; 测试前端请求三个并发,响应时间为平均2000ms左右。 单个请求,响应时间为600ms左右 2.将后台方法改为同步,直接return 空的JSON字符串,那么时间与异步的基本一致
  • 打赏
  • 举报
回复
引用 5 楼 Liu_LY95 的回复:
1: 4342.380126953125ms 2: 3698.45703125ms 3: 2882.753173828125ms 如果把 bindB(); bindC(); 暂时屏蔽掉,单个 bindA的时间为 701.97021484375ms
你可以把后端代码返回的 json 改为一个非常小的固定内容,例如 {},看看结果。另外就是不要使用 asp.net 多余的服务器端端封装、解析功能,应该尽量减少 asp.net 干扰机制。 其实 asp.net 本来就是使用多线程并发模式来处理每一个请求的,那么在你的后端代码中——比较简单的代码中——写await 反而是多于地,反而可能是更慢了。你可以测试一下。
笑容融化坚冰 2018-04-29
  • 打赏
  • 举报
回复
1.尝试把后端里的log.Error语句注释掉,看看前端显示三个调用是多少时间。如果日志是磁盘I/O耗时也挺可观 2.可进一步把_service的几个异步调用的方法,换成await Task.Delay(500)来替代模拟一下异步,看看前端显示三个调用是多少时间。旁观者不知道你的GetDateXX方法内部会不会出并发幺蛾子。
  • 打赏
  • 举报
回复
仅仅从最前端的部分测量,那么得到的东西总是会混合许多干扰。例如 ie8 的 http 并发通讯测试就异常缓慢,它只能有1~2个线程用来处理 ajax 请求,这方面它肯定会比现在的 chrome、firefox 之类的慢数倍速度。
正怒月神 版主 2018-04-28
  • 打赏
  • 举报
回复
很难判断这个情况。 你通过stopwatch来看看,每个后台方法的执行时常
  • 打赏
  • 举报
回复
你可以使用控制台程序测试一下后端代码。 改为 ashx 更好一下,而且也不要使用路由。在路由和解析匹配方法的功能方面其实很慢,没有必要用 asp.net mvc 的封装时候就不要用这种特性,直接使用 ashx 是最干净而且也很简洁的。
Liu_LY95 2018-04-28
  • 打赏
  • 举报
回复
$(function () {
   //控件初始化完成后
   bindA();
   bindB();
   bindC();
})
function bindA() {
console.time(1);
$.ajax({
                type: 'post',
                async: true,
                url: 'Home/GetDateA',
                dataType: 'json',
                success: function (result) {
                     console.timeEnd(1);
                },
                error: function () {
                     
                }
            });
}
function bindB() {
console.time(2);
   $.ajax({
                type: 'post',
                async: true,
                url: 'Home/GetDateB',
                dataType: 'json',
                success: function (result) {
                     console.time(2);
                },
                error: function () {
                     
                }
            });
}
function bindC() {
console.time(3);
      $.ajax({
                type: 'post',
                async: true,
                url: 'Home/GetDateC',
                dataType: 'json',
                success: function (result) {
                     
                },
                error: function () {
                     console.time(3);
                }
            });
}
1: 4342.380126953125ms 2: 3698.45703125ms 3: 2882.753173828125ms 如果把 bindB(); bindC(); 暂时屏蔽掉,单个 bindA的时间为 701.97021484375ms
Liu_LY95 2018-04-28
  • 打赏
  • 举报
回复
引用 3 楼 Liu_LY95 的回复:
[quote=引用 2 楼 hanjun0612 的回复:] 很难判断这个情况。 你通过stopwatch来看看,每个后台方法的执行时常
\
       public async Task<IActionResult> GetDateA()
        {
            Stopwatch timer = new Stopwatch();
            timer.Start();
            var dateA= await _service.GetDateA();
            timer.Stop();
           JsonResult json = Json(dateA);
            log.Error("线程:" + Thread.CurrentThread.ManagedThreadId + ";名称:GetDateA;时间:"+ timer.Elapsed);
            return json ;
        }
同时三个请求,日志 线程:9;名称:GetDateA;时间:00:00:00.3336152 线程:23;名称:GetDateA;时间:00:00:00.2841588 线程:10;名称:GetDateA;时间:00:00:00.4298977 那这么看,每个返回时间也不超过1S Application Insights显示的每个post请求相应时间为1.5-2s左右 这个应该是前端发起请求,到后台返回数据的时间,那么,这些时间应该是阻塞在了,前端和后台之间 我在看一下,在前端做下计时[/quote] 日志应该是 线程:9;名称:GetDateA;时间:00:00:00.3336152 线程:23;名称:GetDateB;时间:00:00:00.2841588 线程:10;名称:GetDateC;时间:00:00:00.4298977
Liu_LY95 2018-04-28
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
很难判断这个情况。 你通过stopwatch来看看,每个后台方法的执行时常
\
       public async Task<IActionResult> GetDateA()
        {
            Stopwatch timer = new Stopwatch();
            timer.Start();
            var dateA= await _service.GetDateA();
            timer.Stop();
           JsonResult json = Json(dateA);
            log.Error("线程:" + Thread.CurrentThread.ManagedThreadId + ";名称:GetDateA;时间:"+ timer.Elapsed);
            return json ;
        }
同时三个请求,日志 线程:9;名称:GetDateA;时间:00:00:00.3336152 线程:23;名称:GetDateA;时间:00:00:00.2841588 线程:10;名称:GetDateA;时间:00:00:00.4298977 那这么看,每个返回时间也不超过1S Application Insights显示的每个post请求相应时间为1.5-2s左右 这个应该是前端发起请求,到后台返回数据的时间,那么,这些时间应该是阻塞在了,前端和后台之间 我在看一下,在前端做下计时

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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