我有一个定时在应用程序后台运行的任务。第一次运行它时一切正常,任务顺利结束。但是第二次及之后每当我使用task.Start()
时都会抛出异常:
'mscorlib.dll' 中发生了未经处理的类型为 'System.InvalidOperationException' 的异常 其他信息: 无法在已完成的任务上调用 Start。
我确定我的任务函数运行到了末尾..我该怎么做才能定期运行任务?
Stephen Taub解释了这个问题(我实际上可以推荐阅读他关于Tasks的更多文章)
- 问题:我可以在同一个Task上调用多次Start方法吗?
不可以。任务只能从已创建状态转换一次,而Start方法将任务从已创建状态转换出去:因此,Start方法只能使用一次。任何尝试在不处于已创建状态的任务上调用Start方法都会导致异常。 Start方法采用同步机制确保任务对象即使同时被多次调用仍然保持一致状态...只有其中一个呼叫可能成功。
.. 这也是您看到的。您可以例如使用计时器并每次启动新任务。
如果需要检查一次只运行一个任务,可以在当前正在运行的任务上检查TaskStatus.RanToCompletion
。
请看一下System.Threading.Timer
,它可以让您定期执行回调方法。对于需要每小时、重复等运行的任务非常有用。如果需要确保计时器仅同步运行(以防运行重叠),请不要忘记锁定回调方法体。
Threading.Timer
而不是其他版本,因为它是更高效的版本。老实说,我没有深入研究过这个问题。 - Haney