c# - 在对 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:异步模块或处理程序已完成,而异步操作仍处于挂起状态。]
解决方案
我通过用一个任务包装整个过程来解决这个问题。 这篇文章帮助我理解了这个概念。
完成任务,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);
}
推荐阅读
- php - 当我使用选项卡或尝试使用空格时,Cloud9 上会显示 AWS 上的 EC2 实例的绿色空格?
- laravel - 子域重新路由到域
- php - 如何填充两个下拉列表,一个取决于另一个携带 json
- java - 将 PEM 转换为 PKCS12 并导入到 Java 密钥库
- python - Python 文本文件
- r - Sparklyr 连接错误: spark_connect_gateway 中的错误(gatewayAddress,gatewayPort,sessionId,:本地主机中的网关:8880 没有响应
- php - Laravelsai - 如何在 VSCode 中使用 windows docker 桌面进行调试
- ios - 如何模拟多台计算机以使用相同的 iOS 应用程序/项目/存储库?
- algorithm - 多个SETS的在线压缩算法?
- mysql - 使用返回 ID 字符串的子查询执行 WHERE ID IN