【问题标题】: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或者别的什么,当我点击它时,让程序完成删除她所在的账户数据,然后停止并退出。

标签: c# asp.net-core cancellation cancellationtokensource cancellation-token


【解决方案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 查看此链接。 stackoverflow.com/questions/1119841/…
  • 嘿,我认为这对我没有帮助......你能为我写一个小例子吗?用你写的东西和外面的canceltoken ...
  • @Xodya 如果你想检测 ctrl+c 也检查这个链接meziantou.net/detecting-console-closing-in-dotnet.htm
  • 您可以考虑使用ThrowIfCancellationRequested,因为这会使任务进入取消状态而不是 RanToCompletion。如果您选中“IsCancellationRequested”,则调用者无法知道是否所有帐户都已删除。
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多