如何暂停和恢复异步运行的任务

Mat*_*gan 2 .net asynchronous async-await c#-4.0

我有一个长时间运行的代码,我想暂停恢复功能。在 start 方法中,我正在编写我的代码并开始新的异步任务。但我希望根据需要暂停/恢复此任务。

  var myTask;
  public void start()
    {
        myTask = Task.Factory.StartNew(() =>
        {
         ///my business logic
        });
    }
Run Code Online (Sandbox Code Playgroud)

Har*_*lse 5

您必须了解任务和线程之间的区别。任务是您想要完成的事情。线程是执行该任务的众多可能工作线程之一。单独的任务不必由单独的线程执行。同一个线程可以执行多个任务。一项任务可能由多个线程执行。

如果您想要某种级别的控制,您希望能够在任何时候暂停正在运行的任务一段时间,而不管它现在正在做什么,请考虑使用线程。请注意,当您暂停一个线程一段时间时,它将持有当时可能使用的稀缺资源。

因此,仅在某些预定义的执行点保留您的流程可能更明智。在这种情况下,Task 可能是更明智的选择。

通过使用任务,您表示您不想被执行的人打扰,因此您无法控制刽子手。事实上,通过使用一个任务,你表示你甚至不在乎你的整个过程是由一个线程还是多个线程处理。

如果您想在流程中的某些定义点停止流程的执行,请考虑将任务划分为子任务,每个子任务在您希望流程停止的点结束。通过使用 Task.ContinueWith,您可以决定任务何时应继续处理流程的下一步。

简洁的解决方案是将您的流程(或任务)包装到一个类中,该类的用户可以说:运行直到执行步骤 X,或者:运行直到达到状态 Y。这样,类的用户甚至不必知道您的进程是使用任务还是线程运行的。