C# 如何在主线程结束后保持任务运行?

C# 如何在主线程结束后保持任务运行?,c#,multithreading,task,C#,Multithreading,Task,我有一个每15分钟运行一次的应用程序。我需要添加一个新任务(可能是一个方法),该任务将由应用程序调用,并且应该异步运行,这样应用程序可以在15分钟内完成。如果新任务的运行时间超过应用程序的运行时间,它将被中止,无法完成其工作。如何保持任务运行?有几种方法可以实现这一点 独立进程 首先,不要运行任务,而是运行一个独立的进程来完成这项工作。第一个过程将在需要时结束;工作进程将在需要时结束,并且它们之间没有通信(除非出于不同的原因需要通信) 现在,上面的意思是创建两个独立的可执行文件;一个给发射器,一

我有一个每15分钟运行一次的应用程序。我需要添加一个新任务(可能是一个方法),该任务将由应用程序调用,并且应该异步运行,这样应用程序可以在15分钟内完成。如果新任务的运行时间超过应用程序的运行时间,它将被中止,无法完成其工作。如何保持任务运行?

有几种方法可以实现这一点

独立进程 首先,不要运行任务,而是运行一个独立的进程来完成这项工作。第一个过程将在需要时结束;工作进程将在需要时结束,并且它们之间没有通信(除非出于不同的原因需要通信)

现在,上面的意思是创建两个独立的可执行文件;一个给发射器,一个给工人。这意味着两个独立的项目。。。或者不是

您可以做的是将两组功能放在同一个可执行文件中,并通过使用命令行参数分隔来调用所需的功能。大体上,你可以做到:

static void Main(string[] args)
{
   if (args.Length == 1 && args[0] == "worker")
      DoWorkerStuff();
   else
   {
      var process = new Process(); // create the process
      ...
      // use process API to call yourself with the arg
      process.Start();
      // process.WaitForExit(); this is commented out because you want main process to end without waiting
   }

    // main then ends here for both the launcher and the worker
}
我喜欢这种方法,因为由于流程边界,您可以完全隔离,但您不必编译和维护单独的项目

等待主线程 第二种方法是让主线程等待工作线程任务完成。试图让任务超过主线程的生命周期可能会有问题。等待很容易

    // in main thread...
    var task = ... // however you create the task
    ...
    task.Wait(); // or one of the other Wait() overloads

当然,还有其他方法可以启动后台工作(例如使用
线程
),以及后台工作向主线程发送信号的方法,但所有这些都要求原始线程等待工作完成。

在主线程上等待其完成?如果在下一次运行中上一次尚未完成,会发生什么情况?它到底应该运行,还是不运行,还是等待上一次运行结束后再开始?惯用的方法是C#7.1中引入的异步主语言功能:@500 InternalServerError,这将限制主线程在15分钟内完成。@Magnetron它应该等待上一次运行结束,然后再开始新的运行。但是额外的任务不应该减慢主应用程序的速度。自己的进程将是一个很好的解决方案。但是有没有办法不添加额外的.exe?我需要调用一个外部的.exe文件,对吗?或者我可以从主进程中的方法执行代码吗?第二种解决方案将限制主要流程的完成:/有一种方法。我将更新我的答案。谢谢,不,我理解这个概念:),但遗憾的是,我不知道如何实现这个//使用流程API使用arg调用自己
    // in main thread...
    var task = ... // however you create the task
    ...
    task.Wait(); // or one of the other Wait() overloads