首页 > 解决方案 > 在对 Post 方法的第二次调用中获得“异步模块或处理程序已完成,而异步操作仍处于挂起状态”

问题描述

我的 ApiController 中有以下方法,

public  Task<HttpResponseMessage> Post([FromBody] CardParameters paras)
{
        int amount = Convert.ToInt32(paras.Amount);
        int cashout = Convert.ToInt32(paras.CashOut);

        var promise = new TaskCompletionSource<HttpResponseMessage>();

        void getResponse(string s)
        {   
            promise.SetResult(Request.CreateResponse(s)); // this line executes in 2 seconds
        }

        AdpResponse ar =  getResponse;
        ta.purchase(amount, cashout, ar);
        return promise.Task;
}

“ta.purchase”方法位于第 3 方应用程序中。该应用程序将在流程结束时调用“getResponse”方法。

客户端应用程序在第一次调用此方法时收到结果。但是从第二次调用客户端收到错误“[InvalidOperationException:异步模块或处理程序已完成,而异步操作仍处于挂起状态。]

标签: c#asp.netasp.net-web-apitask

解决方案


我通过用一个任务包装整个过程来解决这个问题。 这篇文章帮助我理解了这个概念。

完成任务,setResult(s)但不会从 ASP.net 注销任务。因此 ASP.net 在尝试退出该方法时会引发错误。所以我不得不使用任务。这行得通。

public  Task<HttpResponseMessage> Post([FromBody] CardParameters paras){
    int amount = Convert.ToInt32(paras.Amount);
    int cashout = Convert.ToInt32(paras.CashOut);

    string myResult ="";

    var _t = Task.Run(async () =>
    {
         
        var promise = new TaskCompletionSource<HttpResponseMessage>();

        void getResponse(string s)
        {   
            promise.SetResult(s); 
        }

        AdpResponse ar =  getResponse;
        ta.purchase(amount, cashout, ar);
        myResult = promise.Task.Result;
    });
    await _t;
    return Request.CreateResponse(myResult); 
}

推荐阅读