【问题标题】:How to use ContinueWith properly when the other task may continue running forever? [duplicate]当其他任务可能永远继续运行时,如何正确使用 ContinueWith? [复制]
【发布时间】:2018-10-06 18:21:16
【问题描述】:

当其他任务有可能永远继续运行时,如何正确使用ContinueWith

示例:

task 是无限的,但我只想等她特定的时间:

var task = Task.Factory.StartNew(() => 
{
    //Small chance for infinite loop
});

task.ContinueWith(t => {
    //We would still like to get here after a certion amount of time eventualy.
});

【问题讨论】:

  • 简短的回答是你没有......这没有任何意义,如果你想要一个可能的永无止境的任务并且你想要ContinueWith,那么你没有适合工作的工具
  • @Saruman 但我想保护自己不要永远等待
  • 您在此处使用.ContinueWith 的具体情况如何?你是检查t 是否有错误还是只是想执行一些业务逻辑?

标签: c# asynchronous continuewith


【解决方案1】:

你可以运行另一个Task.Delay来等待

var task = Task.Factory.StartNew(() => 
        {
            //Small chance for infinite loop
        });
        var delayTask = Task.Delay(2000); // A wait task 
        Task.WhenAny(delayTask,task).ContinueWith((t) =>
        {
            //check which task has finished 
        });

但是您应该使用一种方法来停止 First Task Some How 超时或使用 CancellationTokenSource

【讨论】:

  • 如果您不在乎,线程池中的一个线程可能会永远工作。有时我怀疑我的操作系统以同样的方式工作。 :)
  • @AccessDenied 你是对的我更新答案
  • ContinueWith 的位置发生了变化,所以它将在“task”完成或“delayTask”完成后运行,以先发生者为准
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多