如何取消任务但让她完成块?
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 任务并优雅地结束?