C#WebAPI 2异步方法,因此用户不必等待

时间:2018-03-08 02:42:57

标签: c# async-await asp.net-web-api2 task

我有以下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以实现此目的的任何线索?

1 个答案:

答案 0 :(得分:-1)

如果你不需要回复有意义的回复,那就不小心点了。将方法体包装在传递给Task.Run(返回Task)的lambda中。无需使用awaitasync。您只是等待Task,端点将立即返回。

但是,如果您需要返回一个取决于操作结果的响应,那么您需要某种报告机制,例如SignalR。

编辑:基于对原始帖子的评论,我的建议是将代码包装在await Task.Run(()=>...)中,即在返回之前确实await。这将允许长时间进程异步运行在不同的线程上,但响应仍将等待结果,而不是让用户不知道它是否已完成(因为您无法控制UI)。你必须测试它,看看这样做是否真的有任何性能上的好处。我怀疑它会有很大的不同。