2015-04-08 168 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