C# 针对ajax.abort()的ASP.NET MVC变通方法

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; } 如何在中止调用后强制线程死亡,以防止执行缓

我在asp.net mvc上有一个rest端点:

[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;
}