Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
565 views
in Technique[技术] by (71.8m points)

c# - Cancel Async Task with CancellationTokenSource from a button click not working

What I need to do is able to cancel a task that is running async. Task should be cancelled on cancel button click. I have done it with CancellationTokenSource. But it is not working properly.

public class classA 
{
    CancellationTokenSource _tokenSource = null;

    public void OnCancelButtonClick()
    {
        MessageBox.Show("Do you Really want to cancel upload");            
        _tokenSource = new CancellationTokenSource();
        _tokenSource.Cancel();
    }

    public async void UploadBtnClick(object param )
    {
        _tokenSource = new CancellationTokenSource();
        var token = _tokenSource.Token;
        try
        {
            await Task.Run(() => UploadFunction(token));
        }
        catch(OperationCanceledException ex)
        {
            MessageBox.Show(ex.Message);

        }
        finally
        {
            _tokenSource.Dispose();
        }
    }

    public Task<bool> UploadFunction(CancellationToken token)
    {
        foreach
        {
            //code here

            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
        }          
    }
}

I am calling OnCancelButtonClick from another function

public class classB 
{
    public void CancelUploadBtnExecute(object param)
    {
        FilesViewModel vm = new FilesViewModel();
        vm.OnCancelButtonClick(); 
    }
}

when I click on OnCancelButtonClick , IsCancellationRequested is false, but not reflected inside UploadFunction so the task won't stop.

question from:https://stackoverflow.com/questions/65921193/cancel-async-task-with-cancellationtokensource-from-a-button-click-not-working

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It's because you are initializing new CancellationTokenSource in OnCancelButtonClick().

Just remove this line from OnCancelButtonClick()

_tokenSource = new CancellationTokenSource();

UploadFunction method is using token created from CancellationTokenSource in UploadBtnClick method.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...