【问题标题】:Watch async task duration [closed]观看异步任务持续时间 [关闭]
【发布时间】:2016-03-09 14:34:42
【问题描述】:

我正在使用

Task task = new Task(action);
task.Start();

大量调用第三方库的 API。通常这个任务不会超过一秒钟。

但我怀疑有时任务会挂起,因此会造成线程泄漏。

有没有办法从外部检查这个任务的执行时间是否超过 x 秒?

我想过在任务中生成另一个任务/计时器来测量它,或者永久轮询Task.Status,但也许有更优雅的方式?

【问题讨论】:

  • 如果挂起,我不确定您有多少选择 - 您可以使用任务队列,然后您可以询问是否所有操作都已完成。然后,您可以对剩余的任务发出死亡威胁,但如果它正确挂起,它不会有任何影响。
  • 当您对某个有问题的主题不太了解时,描述您的实际观察而不是您的怀疑会有所帮助。
  • 你能告诉我们action实际上在做什么吗?这个问题目前太宽泛了。
  • @CodeCaster:解释这个问题太多了。
  • 定义“从外部”——你的意思是从你的进程中的另一个线程?还是来自另一个进程(例如,来自“任务管理器”或调试器)?

标签: c# .net task-parallel-library


【解决方案1】:

你试过了吗:

if(task.Wait(new TimeSpan(0,0,x)))
{
  //completed in x seconds
}
else
{
  //didn't complete
}

【讨论】:

  • 问题是,如果超时,那么“超时定义的时间间隔过去了。在这种情况下,当前线程恢复执行,方法返回false。”,从而杀死任务。我认为 OP 希望以不同的方式处理这种情况,而不是杀死它。
  • @TamasIonut - 不,它没有。 Task.Wait documentation 中的任何地方都没有说任务被杀死。您可以通过将if 更改为while 语句来测试它,它将重新评估直到任务完成。
【解决方案2】:
Stopwath stop = new Stopwatch();
stop.Start();
Task task = new Task(action);
task.ContinueWith(()=>{stop.Stop();})
task.Start();

然后您将能够在 Elapsed 属性中看到任务花费了多少时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多