我有以下WebAPI
2方法:
public HttpResponseMessage ProcessData([FromBody]ProcessDataRequestModel model)
{
var response = new JsonResponse();
if (model != null)
{
// checks if there are old records to process
var records = _utilityRepo.GetOldProcesses(model.ProcessUid);
if (records.Count > 0)
{
// there is an active process
// insert the new process
_utilityRepo.InsertNewProcess(records[0].ProcessUid);
response.message = "Process added to ProcessUid: " + records[0].ProcessUid.ToString();
}
else
{
// if this is a new process then do adjustments rules
var settings = _utilityRepo.GetSettings(model.Uid);
// create a new process
var newUid = Guid.NewGuid();
// if its a new adjustment
if (records.AdjustmentUid == null)
{
records.AdjustmentUid = Guid.NewGuid();
// create new Adjustment information
_utilityRepo.CreateNewAdjustment(records.AdjustmentUid.Value);
}
// if adjustment created
if (_utilityRepo.CreateNewProcess(newUid))
{
// insert the new body
_utilityRepo.InsertNewBody(newUid, model.Body, true);
}
// start AWS lambda function timer
_utilityRepo.AWSStartTimer();
response.message = "Process created";
}
response.success = true;
response.data = null;
}
return Request.CreateResponse(response);
}
上述方法有时需要3-4秒才能处理(一些数据库调用和其他计算),我不希望用户等到所有执行完毕。
我希望用户点击web api方法并几乎立即获得成功响应,同时服务器正在完成所有执行。
有关如何实现
Async / Await
以实现此目的的任何线索?
答案 0 :(得分:-1)
如果你不需要回复有意义的回复,那就不小心点了。将方法体包装在传递给Task.Run(返回Task
)的lambda中。无需使用await
或async
。您只是等待Task
,端点将立即返回。
但是,如果您需要返回一个取决于操作结果的响应,那么您需要某种报告机制,例如SignalR。
编辑:基于对原始帖子的评论,我的建议是将代码包装在await Task.Run(()=>...)
中,即在返回之前确实await
。这将允许长时间进程异步运行在不同的线程上,但响应仍将等待结果,而不是让用户不知道它是否已完成(因为您无法控制UI)。你必须测试它,看看这样做是否真的有任何性能上的好处。我怀疑它会有很大的不同。