-6ren">
gpt4 book ai didi

c# - Task.ContinueWith() 正在执行但任务状态仍然是 "Running"

转载 作者:行者123 更新时间:2023-12-03 05:55:36 25 4
gpt4 key购买 nike

考虑以下代码:

MyTask = LongRunningMethod(progressReporter, CancelSource.Token)
.ContinueWith(e =>
{ Log.Info("OnlyOnCanceled"); },
default,
TaskContinuationOptions.OnlyOnCanceled,
TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(e =>
{ Log.Info("OnlyOnFaulted"); },
default,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(e =>
{ Log.Info("OnlyOnRanToCompletion"); },
default,
TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(e =>
{ Log.Info("None"); },
default,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
  • 当我使用提供的 CancelSource 取消任务时,输出为:OnlyOnCanceledNone正如预期的那样。
  • 当 LongRunningMethod 抛出异常时输出为:OnlyOnFaultedNone正如预期的那样。
  • LongRunningMethod完成输出为:None所以ContinueWithTaskContinuationOptions.OnlyOnRanToCompletion没有按照我的预期执行。

  • 我查了 MyTask.Status在最后 ContinueWith分支,它仍然是 Running .因此,考虑到这一点,我希望跳过 OnlyOnRanToCompletion。问题是,为什么 Status仍然 Running ?查看调试输出,我可以看到 LongRunningMethod跑到最后。

    最佳答案

    看起来您正在将延续任务相互链接起来,而不是全部从原始任务中分离出来。这意味着您的 TaskContinuationOptions 指的是链中上一个任务的完成状态,而不是原始父级 (MyTask)。
    我会尝试类似以下的东西(我不能在本地尝试这个确切的版本,因为我没有你的所有功能,但类似的东西对我有用)。

        MyTask = LongRunningMethod(mods, Settings, progressReporter, CancelSource.Token);

    MyTask.ContinueWith(e =>
    {
    Log.Info("OnlyOnCanceled");
    }, default ,TaskContinuationOptions.OnlyOnCanceled, TaskScheduler.FromCurrentSynchronizationContext());

    MyTask.ContinueWith(e =>
    {
    Log.Info("OnlyOnFaulted");
    }, default ,TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());

    MyTask.ContinueWith(e =>
    {
    Log.Info("OnlyOnRanToCompletion");
    }, default ,TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());

    MyTask.ContinueWith(e =>
    {
    Log.Info("None");
    }, default ,TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());

    这给了我:
    OnlyOnRanToCompletion  
    None

    关于c# - Task.ContinueWith() 正在执行但任务状态仍然是 "Running",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62233591/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com