2011-02-18 54 views
4

我有一個簡單的形式的ASP.NET頁面。用戶用一些細節填寫表單,上傳文檔,然後需要在服務器端進行一些文件處理。如何從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(); 

任何建議表示讚賞。

回答

7

你可以在一個典型的火異步調用的處理功能,而忘記時尚:

在.NET 4.0你應該這樣做,使用新Task Parallel Library

Task.Factory.StartNew(() => 
{ 
    // Do work 
}); 

如果您需要將參數傳遞給動作代表你可以做這樣的:

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

在.NET 3.5和更早你反而會做這種方式:

ThreadPool.QueueUserWorkItem(args => 
{ 
    // Do work 
}); 

相關資源:

+0

我已經使用類似的方法試過,但我的任務從來沒有在服務器上運行,我已經添加了我的問題的代碼。我究竟做錯了什麼? – 2011-02-18 14:54:25

2

用途:

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

凡MYFUNC()不會在用戶後,後臺服務器端處理提交頁面;

1

我有一個網站有一些潛在的長期運行需要響應的東西並更新用戶的計時器。

我的解決辦法是建立一個狀態機進入頁面帶有隱藏值和一些會話值。

我有這些對我的aspx方:

<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