2013-05-03 63 views
0

我是MVC3的新手。在我的項目MVC3中,我使用線程來導入excel 工作表到數據庫,它完美地工作。我有以下疑問, 1)如何使用CancellationToken停止線程? - 在我的MVC#表格中,我有以下兩個按鈕,分別命名爲Cancel和Import 。 2)在導入按鈕提交事件我有以下代碼。如何在MVC3中使用cancellationToken?

//Button Click on Import 
    [HttpPost] 
    public ActionResult FinalImport(FormCollection collection) 
     { 
      Task.Factory.StartNew(() => 
      { 
       //My Coding To Import 

      } , tokenSource.Token); 

      return null; 
     } 

    CancellationTokenSource tokenSource=new CancellationTokenSource(); 

    //Button Click on Cancel 
    public void CancelToken() 
    { 
     tokenSource.Token.ThrowIfCancellationRequested(); 
     tokenSource.Cancel(); 
     // return null; 
    } 

注:如果我點擊導入按鈕和運行任務的時間,然後點擊取消按鈕menas什麼都不會發生。如何取消線程進程的執行。 請幫我做到這一點......

回答

3

因爲網絡本質上是一個無狀態環境,所以您需要一些方法來將取消令牌從一個請求持久保留到另一個請求。 FinalImport和CancelToken方法是分開的請求。該應用程序將每個應用程序視爲全新的應用程序,就好像它以前從未見過以前的請求一樣。您正在編寫代碼,就好像它在有狀態環境中運行一樣。

以下內容適用於您。

這裏是高級步驟:

  • 創建於FinalImport方法你tokenSource。
  • 將令牌源添加到具有將保持請求的唯一密鑰的字典中。 (比如說聲明爲靜態,這對整個應用程序來說是全局的)。
  • 將密鑰傳回給瀏覽器。

當用戶按下在瀏覽器中取消按鈕:

  • 讓瀏覽器在發送請求的關鍵。
  • 在您的CancelToken中,使用瀏覽器隨請求發送的密鑰來查找字典。
  • 使用詞典中的tokenSource取消該任務。
  • 從字典中刪除令牌。

你也應該如您在任務的最後一件事,從詞典中刪除令牌(否則他們只會建立並一直上升,直到耗盡內存)

如果出於任何原因,運行您的Web應用程序的過程應該失敗,並且IIS必須重新啓動它,那麼您將丟失字典。由於各種原因,例如內存壓力(例如,你可能有內存泄漏,並創建了一個新的進程),或者因爲從上次重新啓動後的29小時,IIS會重啓你的進程,或者因爲任何數量的東西。如果您正在運行Web園或Web場,則不能保證每次請求都返回到相同的進程,因此字典可能無法使用。

雖然我意識到這不是一個代碼解決方案,但我希望這有助於更好地理解問題域。

+0

可以給我發送模型Code @Colin Mackay .. – 2013-05-06 05:41:19

+0

很好的解決方案。會嘗試一下。謝謝 – 2016-09-16 13:49:31

0

最後我找到了解決辦法。

1)需要將CancellationTokenSource初始化爲靜態。

2)需要在CancelToken方法中配置CancellationTokenSource對象tokensource
調用。

public static CancellationTokenSource tokenSource; 

[HttpPost] 
    public ActionResult FinalImport(FormCollection collection) 
     { 
      tokensource=new CancellationTokenSource(); 
      Task.Factory.StartNew(() => 
      { 
       if (ts.IsCancellationRequested) 
          { 
           break; 
          } 
       //My Coding To Import 

      } , tokenSource.Token); 

      return null; 
     } 



    //Button Click on Cancel 
    public void CancelToken() 
    { 

     tokenSource.Cancel(); 
     tokensource.Dispose(); 
    } 

就是這樣.. 快樂編碼.... !!!!

+3

您可能遇到擴展超過一個用戶的問題 – Foole 2013-05-07 09:32:39

+0

如何克服擴展問題@Foole – 2013-05-07 09:37:27