Asp.net mvc 2 如何从ASP.NET页面运行冗长的任务?

Asp.net mvc 2 如何从ASP.NET页面运行冗长的任务?,asp.net-mvc-2,Asp.net Mvc 2,我有一个简单表单的ASP.NET页面。用户用一些细节填写表单,上传文档,然后需要在服务器端对文件进行一些处理 我的问题是-处理服务器端文件处理的最佳方法是什么?处理涉及调用exe。我应该使用单独的线程吗 理想情况下,我希望用户在处理过程中提交表单,而不将网页挂在那里 我已尝试此代码,但我的任务从未在服务器上运行: Action<object> action = (object obj) => { // Create a .xdu file for this job

我有一个简单表单的ASP.NET页面。用户用一些细节填写表单,上传文档,然后需要在服务器端对文件进行一些处理

我的问题是-处理服务器端文件处理的最佳方法是什么?处理涉及调用exe。我应该使用单独的线程吗

理想情况下,我希望用户在处理过程中提交表单,而不将网页挂在那里

我已尝试此代码,但我的任务从未在服务器上运行:

Action<object> action = (object obj) =>
{
      // Create a .xdu file for this job
       string xduFile = launcher.CreateSingleJobBatchFile(LanguagePair, SourceFileLocation);

      // Launch the job                 
      launcher.ProcessJob(xduFile);
};

Task job = new Task(action, "test");
job.Start();
Action动作=(对象对象对象)=>
{
//为此作业创建.xdu文件
字符串xduFile=launcher.CreateSingleJobBatchFile(LanguagePair,SourceFileLocation);
//开展工作
启动器.ProcessJob(xduFile);
};
任务作业=新任务(操作,“测试”);
job.Start();
欢迎提出任何建议。

使用:

ThreadPool.QueueUserWorkItem(o => MyFunc(arg0, arg1, ...));

其中MyFunc()在用户提交页面后在后台进行服务器端处理

您可以以经典的即发即忘的方式异步调用处理功能:

在.NET 4.0中您应该使用新的:

如果需要将参数传递给动作委托,可以这样做:

Action<object> task = args =>
{
    // Do work with args
};    
Task.Factory.StartNew(task, "SomeArgument");
相关资源:


我有一个网站,它可以做一些潜在的长时间运行的事情,需要响应并为用户更新计时器

我的解决方案是在页面中构建一个具有隐藏值和一些会话值的状态机

我在我的aspx端有这些:

<asp:Timer ID="Timer1" runat="server" Interval="1600" />
<asp:HiddenField runat="server" ID="hdnASynchStatus" Value="" />

我尝试过使用类似的方法,但我的任务从来没有在服务器上运行过,我已经在我的问题中添加了代码。我做错了什么?@Jimmy:你能试试上面两个建议中的任何一个吗?@mellamokb-当我使用第二个建议时,我得到一个NullReferenceException,第一个没有发生任何事情,即没有异常,处理也没有发生。@Jimmy:如果你不作为后台任务运行,你试图运行的代码工作正常吗?您是否传递了需要处理的所有数据?如果示例代码不太大,可能会有帮助。@Jimmy:
HttpContext。新线程中可能不存在当前的
。您可以将该路径作为参数传入。
ThreadPool.QueueUserWorkItem(args =>
{
   // Do work
});
<asp:Timer ID="Timer1" runat="server" Interval="1600" />
<asp:HiddenField runat="server" ID="hdnASynchStatus" Value="" />
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    PostbackStateEngineStep()
    UpdateElapsedTime()
End Sub

Private Sub PostbackStateEngineStep()
    If hdnASynchStatus.Value = "" And Not CBool(Session("WaitingForCallback")) Then

        Dim i As IAsyncResult = {...run something that spawns in it's own thread, and calls ProcessCallBack when it's done...}

        Session.Add("WaitingForCallback", True)
        Session.Add("InvokeTime", DateTime.Now)
        hdnASynchStatus.Value = "WaitingForCallback"
    ElseIf CBool(Session("WaitingForCallback")) Then
        If Not CBool(Session("ProcessComplete")) Then
            hdnASynchStatus.Value = "WaitingForCallback"
        Else
            'ALL DONE HERE
            'redirect to the next page now
            response.redirect(...)
        End If
    Else
        hdnASynchStatus.Value = "DoProcessing"
    End If
End Sub
Public Sub ProcessCallBack(ByVal ar As IAsyncResult)
    Session.Add("ProcessComplete", True)
End Sub
Private Sub UpdateElapsedTime()
    'update a label with the elapsed time
End Sub