如何取消任务但让她完成块?

Posted

技术标签:

【中文标题】如何取消任务但让她完成块?【英文标题】:How to cancel task but let her to finish the chunk? 【发布时间】:2021-09-06 20:51:50 【问题描述】:

我有一个程序 (.NET Core C#) 从数据库中删除每个帐户的数据 - 删除与该帐户相关的所有数据。 我想添加一个选项来停止程序,但为程序所在的人完成删除,然后停止并退出。 我想做这样的事情,当我按任意键时,程序将完成打印 10 个条目,然后停止并退出。例如:

public static void Main(string[] args)

    // ???
    



static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)

    Console.WriteLine("Shutting down...");
    // Cleanup here


private static async Task MyTask(CancellationToken cancellationToken)

    Print(cancellationToken);


public static void Print(CancellationToken cancellationToken)

    while (cancellationToken.IsCancellationRequested!)
    
        for (int i = 1; i < 10; i++)
        
            Console.WriteLine(i);
        
    

我想知道你有什么想法, 谢谢!

【问题讨论】:

也许我不明白完整的问题:当我必须中断/取消情况时,我必须检查循环开始(或结束)的条件,并且必须设置从外部(是的,也许如果这是异步或线程,您必须解决该通信任务)但基本上:归结为“如果(中断条件)......” 我的意思是从外部获取信息,比如ctrl+c或者别的什么,当我点击它时,让程序完成删除她所在的账户数据,然后停止并退出。 【参考方案1】:

只是不要将cancellationToken 传递给dbContext。当您可以停止程序时,请手动检查 cancelToken。

private static async Task DeleteAllAccounts(CancellationToken cancellationToken)

    var accounts = await GetAccountsAsync(cancellationToken);
    foreach (var account in accounts)
    
        await DeleteAccountAsync(account, CancellationToken.None);
        if (cancellationToken.IsCancellationRequested)
            break;
    

【讨论】:

嘿,谢谢你的回答!我如何从外部获取信息?我的意思是当我点击 ctrl+c 或其他东西时 @Xodya 查看此链接。 ***.com/questions/1119841/… 嘿,我认为这对我没有帮助......你能为我写一个小例子吗?用你写的东西和外面的canceltoken ... @Xodya 如果你想检测 ctrl+c 也检查这个链接meziantou.net/detecting-console-closing-in-dotnet.htm 您可以考虑使用ThrowIfCancellationRequested,因为这会使任务进入取消状态而不是 RanToCompletion。如果您选中“IsCancellationRequested”,则调用者无法知道是否所有帐户都已删除。

以上是关于如何取消任务但让她完成块?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个任务中取消 ScheduledFuture 任务并优雅地结束?

Java并发编程学习12-任务取消(上)

Java并发编程学习12-任务取消(上)

Flutter中如何取消任务

如何取消 useEffect 清理函数中的所有订阅和异步任务?

如何在超时后取消任务等待