Maris
Maris

Reputation: 4776

ASP.NET MVC workaround for ajax.abort()

I have a rest endpoint on asp.net mvc:

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

On the frontEnd I have a next javascript:

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

How to force Thread to die after abort call, to prevent slow calculation to be done?

Thanks in advance.

Upvotes: 3

Views: 1259

Answers (2)

Maris
Maris

Reputation: 4776

I found that Response have isClientConnected property. So we can use next approach:

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

Can we? Or I miss something?

UPDATE:

Yes, it works

Upvotes: 1

Konstantin Dinev
Konstantin Dinev

Reputation: 34905

The backend has no idea that you have called abort() and if the request has already been sent then the server-side logic will run until it completes. In order to stop it from running you will have to send another request to your controller which notifies that controller that you've aborted the request and the controller will have to access the instance that is currently running you slow operation and this instance should have a method which forces the calculations to cancel.

Upvotes: 0

Related Questions