C# 重新启动已完成的任务

C# 重新启动已完成的任务,c#,task,C#,Task,我有一个在应用程序后台定期运行的任务。当我第一次运行它时,一切都正常,任务运行到完美结束。但是第二次以及之后,每当我使用task.Start()时,它都会抛出一个异常: mscorlib.dll中发生类型为“System.InvalidOperationException”的未处理异常 其他信息:不能对已完成的任务调用Start 我确信我的任务功能已经完成了。。我应该如何定期运行任务 (实际上,我可以建议你多读一些他关于任务的文章) 问题:我可以就同一任务多次调用Start吗 不可以。一个任务只

我有一个在应用程序后台定期运行的任务。当我第一次运行它时,一切都正常,任务运行到完美结束。但是第二次以及之后,每当我使用
task.Start()
时,它都会抛出一个异常:

mscorlib.dll中发生类型为“System.InvalidOperationException”的未处理异常 其他信息:不能对已完成的任务调用Start

我确信我的任务功能已经完成了。。我应该如何定期运行任务

(实际上,我可以建议你多读一些他关于任务的文章)

  • 问题:我可以就同一任务多次调用Start吗
  • 不可以。一个任务只能从创建状态转换一次,而Start可以从创建状态转换一个任务:因此,Start只能使用一次。对未处于创建状态的任务调用Start的任何尝试都将导致异常。Start方法使用同步来确保任务对象保持一致状态,即使同时多次调用Start…这些调用中只有一个可能成功

    。。这也是你所看到的。例如,您可以使用计时器,每次启动一项新任务。

    如果您需要检查一次只运行一次,则可以检查当前正在运行的任务的
    TaskStatus.RanToCompletion
    查看允许您定期执行回调方法的方法。这对于需要每小时重复运行的任务非常有用。如果需要确保计时器只同步运行(以防运行重叠),请不要忘记锁定回调方法体。

    是否需要重复使用相同的
    任务?你能在每次需要运行代码时创建一个新的吗?谢谢你友好的回复!实际上,Threading.Timer也是线程安全的(它在底部显示)。我的错误我总是被告知使用
    Threading.Timer
    而不是另一个,因为它是一个更有效的版本。老实说,我还没调查过这件事。那么,你和我都是。不久前,我偶然发现了这个SOthread,并从那时起将其用作指南。就在这时,我看到一条评论反驳了投票最多的答案。老实说,另一件事是永远不要相信MSDN的线程安全信息。它错的次数远远多于它对的次数。