c# - 操作运行时异步取消

标签 c# .net async-await cancellationtokensource

我开始了一些关于 .net 中异步编程的测试,现在我一直在尝试使用 cancellationToken 取消一个长操作。

所以我有以下代码:

CancellationTokenSource cancelationToken = new CancellationTokenSource();

我开始操作的按钮

    private void button2_Click(object sender, EventArgs e)
    {
        cancelationToken.Cancel(true);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        StartOperation(cancelationToken.Token);
    }

最后是我的操作

    private async void StartOperation(CancellationToken cancelToken)
    {
        await GetItensFromDatabase2(cancelToken);
    }

    public static Task<int> GetItensFromDatabase(CancellationToken cancelToken)
    {
        //cancelToken.Register( () => Console.WriteLine("Canceled") );
        return Task.Factory.StartNew<int>(() =>
        {
            int result = 0;

            cancelToken.ThrowIfCancellationRequested();

            result = MyLongOperation();  // Simulates my operation -> I want to cancel while this operation is still running

            return result;

        }, cancelToken);
    }

那么,如何取消 MyLongOperation() 方法呢?可以吗?

最佳答案

在任何时候都不可能取消,CancellationToken 的目的是允许用户取消操作,当长时间运行的操作期望...

while(!finished)
{
     cancelToken.ThrowIfCancellationRequested();
     //Some not cancelable operations
}

这里是cancelable方法比较常用的方法

private static void LongRunning(CancellationToken cancelToken)
{
    while (true)
    {
        if(cancelToken.IsCancellationRequested)
        {
            return;
        }
        //Not canceled, continue to work
    }
}

想法是,用户请求取消,但只有执行者决定何时停止他的工作。通常执行者在达到某个“安全点”后进行取消

在不征求意见的情况下中止长时间运行的操作不是很好的体验,很多帖子都写过这个。

关于c# - 操作运行时异步取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21134740/

相关文章:

c# - .Net Core 3.0 JsonSerializer 填充现有对象

c# - 表达式树 - C# 和 VB.NET 中 Action<T> 的不同编译器行为

c# - 如何在 C# 中将窗体居中

c# - 使用在 C# 中声明的虚拟异步任务并在 F# 中覆盖它

javascript - 如何调用异步函数作为响应

c# - 使用 .NET 将 Json 转换为 List<object>

c# - Html.EditorFor 全局模板?

c# - 查找 .NET 规范

c# - 正则表达式匹配不匹配的内容

c# - 使用前缀异步时不会触发 Application_Error 处理程序