2015-04-08 116 views
3

我有asp.net的MVC休息端點:ASP.NET MVC解決方法ajax.abort()

[HttpGet] 
public List<SomeEntity> Get(){ 
    // Lets imagine that this operation lasts for 1 minute 
    var someSlowOperationResult = SomeWhere.GetDataSlow(); 
    return someSlowOperationResult; 
} 

在前端我有一個JavaScript的旁邊:

var promise = $.get("/SomeEntities"); 
setTimeout(function(){promise.abort()}, 100); 

如何強制Thread中止呼叫後死亡,以防止slow計算完成?

感謝您的任何提前。

回答

1

我發現ResponseisClientConnected屬性。所以我們可以用下一種方法:

[HttpGet] 
public List<SomeEntity> Get(){ 
     var gotResult = false; 
     var result = new List<SomeEntity>(); 
     var tokenSource2 = new CancellationTokenSource(); 
     CancellationToken ct = tokenSource2.Token; 
     Task.Factory.StartNew(() => 
     { 
      // Do something with cancelation token to break current operation 
      result = SomeWhere.GetSomethingReallySlow(); 
      gotResult = true; 
     }, ct); 
     while (!gotResult) 
     { 
      if (!Response.IsClientConnected) 
      { 
       tokenSource2.Cancel(); 
       return result; 
      } 
      Thread.Sleep(100); 
     } 
     return result; 
} 

我們可以嗎?或者我想念什麼?

UPDATE:

是的,它的工作原理

+0

即使我們在ajax調用上調用abort(),客戶端仍處於連接狀態,因此IsClientConnected將返回true。如果客戶端重定向到另一個頁面或關閉瀏覽器,它將返回false。 –

+0

@ KonstantinD-Infragistics,但服務器端如何知道客戶端關閉了瀏覽器? ;) – Maris

+0

@ KonstantinD-Infragistics剛剛測試過,你錯了。有用!如果我使用promise.abort()中止請求,我會到達後端的tokenSource2.Cancel()。 – Maris

0

後端不知道你已經調用了abort(),並且如果請求已經發送,那麼服務器端邏輯將運行直到它完成。爲了阻止它的運行,你必須發送另一個請求到你的controller,它通知控制器你已經中止了請求,並且控制器將不得不訪問當前正在運行的實例,而且這個實例應該有一個緩慢的操作,並且這個實例應該有一個強制計算取消的方法。

+0

我認爲,在低級別 - 中止關閉瀏覽器和服務器端之間的連接,所以應該如何處理它的方式。 – Maris

+0

你錯了,看看我的答案並測試它! – Maris