C# 在重定向到其他页面时异步运行方法

C# 在重定向到其他页面时异步运行方法,c#,jquery,ajax,asp.net-mvc,asynchronous,C#,Jquery,Ajax,Asp.net Mvc,Asynchronous,我有一个asp.NETMVC应用程序,它使用J查询和Ajax。其中一个cshtml页面包含一个长时间运行的进程,因此我提出了一个异步方法,使用ajax我能够触发它,希望当长进程在后台运行时,用户可以在不同的页面上做一些其他工作 当我在同一页上工作时,它工作正常。但是当代码在后端运行时,我重定向到另一个页面时,我没有得到任何输出。当另一个方法正在运行时,是否无法重定向?如果是这样的话,我如何才能做到这一点 我的c#contoller public async System.Threading.Ta

我有一个asp.NETMVC应用程序,它使用J查询和Ajax。其中一个cshtml页面包含一个长时间运行的进程,因此我提出了一个异步方法,使用ajax我能够触发它,希望当长进程在后台运行时,用户可以在不同的页面上做一些其他工作

当我在同一页上工作时,它工作正常。但是当代码在后端运行时,我重定向到另一个页面时,我没有得到任何输出。当另一个方法正在运行时,是否无法重定向?如果是这样的话,我如何才能做到这一点

我的c#contoller

public async System.Threading.Tasks.Task<JsonResult> TestAsyncPro(string ComponentId)
{
        try
        {
            await System.Threading.Tasks.Task.Delay(4000); 

            return Json(new { Success = true, Error = "" }, JsonRequestBehavior.AllowGet);

        }

        catch (Exception ex)
        {
            return Json(new { Success = false, Error = ex.Message }, JsonRequestBehavior.AllowGet);
        }
因此,我制作了一个异步方法,并使用ajax触发它,希望用户可以在后台运行长流程时在不同的页面中执行其他工作

你真正想要的是一个独立的背景工作者。ASP.NET通过处理HTTP请求来工作,您希望在HTTP请求之外完成一些工作(即,在HTTP请求完成之后)。因此,您想做的工作并不适合ASP.NET

对于这种情况,我通常推荐一种合适的分布式系统设计。这意味着添加一个可靠队列(Azure队列/Amazon SQS/etc)和一个单独的后端处理器(Azure函数/Amazon Lambda/ASP.NET核心后台服务/Win32服务/etc)。然后ASP.NET处理程序将要执行的后台工作排入队列,并返回重定向;后端处理器将从队列中提取工作并实际执行它

Hangfire是一种低入口解决方案;它使用数据库作为可靠队列,并具有进程内后端处理器(类似于ASP.NET Core HTTP应用程序中托管的ASP.NET Core后台服务)。这种方法有一些折衷之处(例如,您不能独立扩展后端),但如果您还没有使用ASP.NET Core,它是一个不错的解决方案

因此,我制作了一个异步方法,并使用ajax触发它,希望用户可以在后台运行长流程时在不同的页面中执行其他工作

你真正想要的是一个独立的背景工作者。ASP.NET通过处理HTTP请求来工作,您希望在HTTP请求之外完成一些工作(即,在HTTP请求完成之后)。因此,您想做的工作并不适合ASP.NET

对于这种情况,我通常推荐一种合适的分布式系统设计。这意味着添加一个可靠队列(Azure队列/Amazon SQS/etc)和一个单独的后端处理器(Azure函数/Amazon Lambda/ASP.NET核心后台服务/Win32服务/etc)。然后ASP.NET处理程序将要执行的后台工作排入队列,并返回重定向;后端处理器将从队列中提取工作并实际执行它


Hangfire是一种低入口解决方案;它使用数据库作为可靠队列,并具有进程内后端处理器(类似于ASP.NET Core HTTP应用程序中托管的ASP.NET Core后台服务)。这种方法有一些折衷之处(例如,您无法独立扩展后端),但如果您还没有使用ASP.NET Core,这是一个不错的解决方案。

重定向到另一个页面将中止任何正在进行的请求。当前页面中的所有脚本也将消失,因此永远不会调用
success
。我如何才能做到这一点?任何解决方法都会很有帮助,看看如何使用或类似。正如@charlietfl所说,请求在页面退出时结束。如果您有一个长时间运行的任务,您可以让Hangfire在后台执行,并在需要时更新数据库done@GlynnHurrell是免费的吗?是的,100%免费。开源我相信重定向到另一个页面将中止任何正在进行的请求。当前页面中的所有脚本也将消失,因此永远不会调用
success
。我如何才能做到这一点?任何解决方法都会很有帮助,看看如何使用或类似。正如@charlietfl所说,请求在页面退出时结束。如果您有一个长时间运行的任务,您可以让Hangfire在后台执行,并在需要时更新数据库done@GlynnHurrell是免费的吗?是的,100%免费。我相信开源
$('#testasnc').click(function ()
{   
    $.ajax({
        url: '../AccountOpening/TestAsyncPro',
        type: 'POST',
        dataType: 'json',
        cache: false,
        async: true,
        data: { ComponentId: '21' },
        success: function (data) {
            if (data.Success == true)
            {
                $(window).scrollTop(0);
                $("#alrtTestAsnc").show();  
                setTimeout(function () { $("#alrtTestAsnc").hide(); }, 5000);  
            } 
        }
    });

    var url = $("#RedirectTo").val();
    location.href = url;
   
});