Asp.net mvc 2 如何从ASP.NET页面运行冗长的任务?
我有一个简单表单的ASP.NET页面。用户用一些细节填写表单,上传文档,然后需要在服务器端对文件进行一些处理 我的问题是-处理服务器端文件处理的最佳方法是什么?处理涉及调用exe。我应该使用单独的线程吗 理想情况下,我希望用户在处理过程中提交表单,而不将网页挂在那里 我已尝试此代码,但我的任务从未在服务器上运行: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
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");
相关资源:
<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