【问题标题】:Execute a javascript function on completion of C# async function在 C# 异步函数完成后执行 javascript 函数
【发布时间】:2015-12-06 11:00:28
【问题描述】:

我有一个 jquery Ajax 函数

  var arr = {
                id: 1,
                run: true
            }
  $.ajax({
            url: '@Url.Action("Getdata", "Details")',
            data: { Batch: arr},
            type: "POST",
            success: function (result) {
                if (result) {
                    GenNamespace.Completed(result);
                }
            },
            error: function (result) { alert("Problem Occured"); },
        });

调用 c# 异步函数,并在成功完成任务后,我正在 jquery ajax 成功执行某些函数

       public async Task<JsonResult> GetData(Batch arr)
    {
        try
        {
            var success = false;
            var t = await Task.Run(() =>
            {
            //i am Performing long running task here
             return Json(success, JsonRequestBehavior.AllowGet);
            }
            });
            return t;
          }
        catch (Exception ex)
        {
            throw ex;
        }
        return null;
    }

但是这是一个异步函数,所以即使函数没有完全执行,值(成功 = false)也会返回到 jquery 成功,所以我如何仅在完成此任务后调用 javascript 函数,有吗任务完成通知或在这种情况下我可以在这里使用的东西?

【问题讨论】:

  • 异步控制器操作仅从 asp.net 线程的角度来看是异步的,它们与 JavaScript 客户端调用者不异步。
  • @BenRobinson- 是的,没错,我想知道在这种情况下如何利用它来获得优势,
  • 可能是一个愚蠢的问题,但你是否在 Task.Run 中将成功变量设置为 true?
  • 不确定您要做什么,javscript 不会看到异步控制器操作与普通控制器操作之间的区别,它返回成功 false 的原因似乎是因为您从未将其设置为是的。
  • @ieaglle- 是的,我确实在函数的最后一行设置了,但最初它是错误的,但它不会等到函数完成,它会启动任务并返回jqAjax 的成功。

标签: c# jquery asp.net-mvc async-await


【解决方案1】:

下一个代码按预期工作(几乎和你的一样):

    [HttpPost]
    public async Task<JsonResult> GetData()
    {
        var succ = false;
        var taskRes = await Task.Run(async () =>
       {
           await Task.Delay(10000);
           succ = true;
           return Json(succ, JsonRequestBehavior.AllowGet);
       });

        return taskRes;
    }

    $.ajax({
        url: '@Url.Action("GetData", "Home")',
        type: "POST",
        success: function (result) {
            console.log(result);
        },
        error: function (result) { alert("Problem Occured"); },
    });

执行后(10 秒),控制台中显示为“true”。

【讨论】:

    【解决方案2】:

    这样的事情怎么样。我认为您正在发生的事情是您正在调用异步任务,但程序将继续运行并返回。未经测试...

    更新:这会阻止并消除任何异步好处。

        public async Task<JsonResult> GetData(Batch arr)
        {
            try
            {
                return DoTask().Result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return null;
        }
    
        private async Task<JsonResult> DoTask()
        {
            var success = false;
            var t = await Task.Run(() =>
            {
                //i am Performing long running task here
                success = true;
                return Json(success, JsonRequestBehavior.AllowGet);
            });
            return t;
        }
    

    如果您希望 javascript 客户端和 API 之间实现真正的异步,我建议您查看 SignalR

    【讨论】:

    • @deebo- 感谢您的解决方案,我会检查一下并告诉您。
    • Result 属性阻塞当前线程,所以这里没有异步的意义。
    • @ieaglle- 那么我完全误解了这个概念,我将不得不再次阅读异步!
    • 是的,抱歉,我应该在回答中明确说明这一点。这就是我提到 SignalR 的原因。
    • @deebo,SignalR 允许双工通信,据我了解,这里不需要。
    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多