C# 针对ajax.abort()的ASP.NET MVC变通方法
我在asp.net mvc上有一个rest端点:C# 针对ajax.abort()的ASP.NET MVC变通方法,c#,asp.net,ajax,asp.net-mvc,C#,Asp.net,Ajax,Asp.net Mvc,我在asp.net mvc上有一个rest端点: [HttpGet] public List<SomeEntity> Get(){ // Lets imagine that this operation lasts for 1 minute var someSlowOperationResult = SomeWhere.GetDataSlow(); return someSlowOperationResult; } 如何在中止调用后强制线程死亡,以防止执行缓
[HttpGet]
public List<SomeEntity> Get(){
// Lets imagine that this operation lasts for 1 minute
var someSlowOperationResult = SomeWhere.GetDataSlow();
return someSlowOperationResult;
}
如何在中止调用后强制线程
死亡,以防止执行缓慢的
计算
提前感谢。后端不知道您调用了
abort()
,如果请求已经发送,那么服务器端逻辑将运行,直到完成为止。为了停止它的运行,您必须向您的控制器发送另一个请求,该请求通知该控制器您已中止该请求,并且控制器必须访问当前正在运行的实例,您需要执行慢速操作,并且该实例应具有强制执行计算的方法取消。我发现Response
具有isClientConnected
属性。因此,我们可以使用下一种方法:
[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;
}
[HttpGet]
公共列表Get(){
var gotResult=false;
var result=新列表();
var tokenSource2=新的CancellationTokenSource();
CancellationToken ct=tokenSource2.Token;
Task.Factory.StartNew(()=>
{
//使用取消令牌执行某些操作以中断当前操作
结果=某处。GetSomethingReallySlow();
gotResult=true;
},ct);
而(!gotResult)
{
如果(!Response.IsClientConnected)
{
tokenSource2.Cancel();
返回结果;
}
睡眠(100);
}
返回结果;
}
我们可以吗?还是我错过了什么
更新:
是的,它可以工作我认为在低级别上-abort关闭浏览器和服务器端之间的连接,因此应该有处理它的方法。即使我们在ajax调用中调用abort(),客户端仍然是连接的,因此isClient connection将返回true。如果客户端重定向到另一页或关闭浏览器,则返回false。@KonstantinD Infragistics但服务器端如何知道客户端关闭了浏览器?;)@康斯坦丁基础设施刚刚测试过,你错了。它起作用了!如果我使用promise.abort()中止请求,我将访问后端的tokenSource2.Cancel()。
[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;
}