0

我目前正在运营一个电子商务网站。

所以当用户结账时,我有一个银行回调页面......

但是由于我必须在付款发生后执行一项冗长的任务(目前是同步完成的),因此用户必须等待很长时间才能将其重定向回我的网站。

我试图用 thread.start 创建一个后台线程,但问题是我失去了会话,这是不明显的。

那么,根据这个描述,你将如何进行?你会选择异步还是多线程?

如果你会去异步,它会怎么样?

所以我们有类似的东西:

public ActionResult CallBack()
{
    if (AcceptPayment() == "OK")
    {
      LenghtyTask(); 
    }

    return RedirectToUrl("MyWebSite");   
} 
4

3 回答 3

3

首先,在 ASP.NET 站点中运行后台线程是一个很大的禁忌,因为您无法控制应用程序的生命周期。应用程序池可以关闭或回收,这意味着您会丢失数据。

您可以使用数据库来存储任务(并随着作业的进行更新它们的状态),或者简单地创建一个执行作业的 Windows 服务或类似的服务。


由于您无法控制作业的运行,因此询问您是否应该使用异步或线程是没有意义的,因为它们都不会释放任何资源(即使您的应用程序运行得更快)。

只需选择一个您知道的并让 HTTP 请求完成。告诉用户该作业正在后台处理,并让他刷新浏览器以查看其进展情况。另一种方法是使用 Ajax 或 ASP.NET SignalR 在后台检查进度。

于 2013-07-22T19:39:34.733 回答
0

可能会像这样

public ActionResult CallBack()
{
    if (AcceptPayment() == "OK")
    {
        // simply launches the task and moves on
        Task.Run(LenghtyTask()); 
    }

    return RedirectToUrl("MyWebSite");   
} 

现在在您的页面上:RedirectToUrl("MyWebSite")

您将不得不像 Tejs 指出的那样设置一个 ajax 请求,它可以在任务完成时通知用户

public ActionResult IsTaskFinished()
{
    // No clue where your transaction is, but your gonna need to know it to check it's state
    return JSON(SomeClass.Current.IsTaskFinished(ContextBoundObject.Transaction.Id));
} 

您可能想SomeClass.Current.IsTaskFinished(ContextBoundObject.Transaction.Id)在实际启动 ajax 之前调用 /MyWebSite ..以防事务已经完成。

function isTaskFinished() {
    $.post("/IsTaskFinished").always(function(data) {
        if (!!data) {
            setTimout(isTaskFinished, 3000);
        }
        else {
            // yay i'm done, inform user !
        }
    });
}

当然,您必须考虑重试限制、错误处理等。

于 2013-07-22T19:48:59.410 回答
-1

我会将冗长的操作卡在队列中(MSMQ、RabbitMQ 等),并让工作进程(最好是 Windows 服务器)使作业出列并执行那些冗长的操作。

就您如何通知用户而言,有几个选项,但我的选择是实时更新,您可以通过服务器将其推送到客户端浏览器。只需在您的应用程序上有一个 SignalR 端点,并通过您的工作进程上的 SignalR .NET 客户端连接它。完成冗长的操作后,您可以通过 SignalR 端点通知连接的客户端。

正如@jgauffin 指出的那样,无论您做什么,请避免在 ASP.NET 下进行任何数据关键操作恕我直言的后台操作。原因如下:http: //haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

于 2013-07-22T19:53:07.080 回答