【问题标题】:ASP.NET - start a background task without returning any results and blocking the userASP.NET - 启动后台任务而不返回任何结果并阻止用户
【发布时间】:2015-03-12 17:02:13
【问题描述】:

我正在做一个项目,当用户注册完成后,有一些大文件必须复制到其他位置,有时需要大约 10 分钟才能复制所有内容。

我不需要通知用户,也不需要显示任何进度,我要做的就是向用户显示他们已成功注册并调用我的 Web 服务上的方法来启动一个新的后台任务来完成所有耗时的任务。

任何建议都会有所帮助!谢谢。

编辑:

感谢您推荐 JavaScript 方法,但我不想使用 JavaScript,因为用户可以在浏览器上关闭其 JavaScript。

我已经试过了

 await System.Threading.Tasks.Task.Run(() => copyFiles());

但问题是当我将视图返回给用户时,有时服务器会提前终止线程,有时它永远不会完成它的任务(我不知道为什么)

【问题讨论】:

  • 听起来像是 jquery 的工作
  • 这不是一个问题,这是您希望您的代码做什么的声明。请修改它,以便您告诉我们您做了什么,以及您遇到了什么问题。 Stackoverflow 不是代码编写服务
  • @freefaller 很抱歉造成误解,我编辑了我的问题
  • 告诉我们更多关于创建的文件以及 copyFiles 正在做什么。您实际上是在将文件写入光盘,还是在使用 Stream?
  • @user3444160 我正在将文件从其他服务器上传到 SharePoint,平均而言,我们有 10 个文件,每个文件大约 100 MB(~ 1GB/帐户)

标签: c# asp.net asynchronous backgroundworker


【解决方案1】:

在 ASP.NET 中有一些与后台任务相关的第三方库。查看 Scott Hanselman 的 this 文章。可能对你有帮助。

【讨论】:

  • 谢谢,我会试试看@volodymyr-zherebnyi
【解决方案2】:

您可以使用 jQuery 异步调用 C# 函数。在这些 C# 函数中,您可以进行后台工作。您甚至可以将这些函数放在 asmx 文件中并使其成为 [WebMethod]。请参阅使用 jQuery AJAX 调用 C# 函数http://www.yogihosting.com/blog/calling-a-c-function-with-jquery-ajax/

【讨论】:

    【解决方案3】:

    a new method in .NET 4.5.2,可以让你在ASP.NET中做长时间运行的后台进程。

    【讨论】:

    【解决方案4】:

    尝试在异步模式下使用“jQuery.ajax”方法。 供您参考...http://api.jquery.com/jquery.ajax/

    【讨论】:

    • 我认为像这样运行 10 分钟的过程是个坏主意。它将依赖于会话和应用程序池保持活动状态。我会运行一个 Windows 服务,然后它可以寻找新的注册并触发文件复制。
    • 是的,这是另一个不错的选择。使用数据库标志来识别该新注册用户的操作是否已完成。这样,您将分离两个活动。
    【解决方案5】:

    用任务包装您的代码,使其在不同的线程中运行。

    // Use this method. Replace 'id' with the set of parameters you might need.
    public void CopyFilesAsync(int id)
    {
        System.Threading.Tasks.Task.Run(() => CopyFiles(id));
    }
    
    private void CopyFiles(int id)
    {
        // your copy files code here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      相关资源
      最近更新 更多