ASP.NET MVC WebApi控制器方法使用async假死超时问题

竹林之风5个月前技术积累401

        在一个ASP.NET MVC WebApi控制器方法中使用async标记为异步方法后,有时会假死超时。根本原因是同步方法和异步方法混合造成的死锁问题。

using System;

namespace Demo
{
    public class DemoController : ApiController
    {
        public async Task<string> DemoAction()
        {
            await Task.Delay(1000);
            return "OK";
        }
    }
}

        因为async、await具有传染性,使用了它们则在方法上层都要依次传递。所以还需要在Filter、DelegatingHandler等中也使用async、await。

using System;

namespace Demo.Filters
{
    public class BaseFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
        }

        public override async void OnActionExecuting(ActionExecutingContext filterContext)
        {
            await ……
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            
        }   
    }
}
using System;

namespace Demo.Filters
{
    public class CommonDelegatingHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            HttpResponseMessage response = await base.SendAsync(request, cancellationToken);          
            return response;
        }
    }
}


相关文章

Java相关的一些名词

Java语言:一种程序设计语言,版本号从1.0到1.4,从1.5起版本号变更为5、6、……;JDK版本号、Java平台版本号类同。Java平台:1998年12月发布JDK 1.2后,Java从与平台无...

ASP.NET MVC中的Area区域简介

ASP.NET MVC中的Area区域简介

        ASP.NET MVC4有预定义的目录规则,框架根据这些目录规则去加载各种类。在MVC单项目中,随着业务...

可迁移数据库的基本命名和实施规范

前言        数据库管理系统(DBMS)是各类信息系统的核心组成部分,常用的关系数据库系统(RDBMS)有SQLi...

ASP.NET实现HTTP长轮询(四)——WebApi

        本文主要描述如何在ASP.NET WebApi中实现长轮询:(1)控制器:using System; using Syst...

在线支付子模块的设计与实现

在线支付子模块的设计与实现

        一个在线交易系统需要各种支付方式方便客户付款,这些支付方式按场景可分为在线支付和线下现付。线下现付常见的...

如何解决Cookie和Ajax的跨域问题

        Cookie用来在浏览器端保存小文本信息,它的属性Domain和Path用来标识该Cookie在什么域和...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。