我有一个应用程序定期启动一些 fire-and-forget 任务,主要是为了记录日志,我的问题是当应用程序关闭时,任何当前正在运行的 fire-and-forget 任务都会被中止。我想要防止这种情况发生,所以我正在寻找一种机制,允许我在关闭应用程序之前
你可以认为这个要求使我的任务不真正是 fire-and-forget,这其中有一些道理,所以我想澄清这一点:
“CleanUp completed”和“Finished”条目没有被记录,因为应用程序过早终止,并且待处理任务被中止。有没有办法在关闭之前等待它们完成?
顺便说一下,这个问题是受到@SHAFEESPS的一个 最近的问题 的启发的,但很遗憾被关闭了。
澄清一下:上面提供的最小示例包含一种类型的fire-and-forget操作,即Task Log方法。真实世界应用程序启动的fire-and-forget操作是多样化的,有些甚至返回通用任务,如Task或Task。
还可能出现一个fire-and-forget任务会触发次要的fire-and-forget任务,这些也应该被允许开始并等待。
await
所有正在运行的 fire-and-forget 操作完成。我不想处理它们可能出现的异常,我不关心这些。我只想给它们完成的机会(可能带有超时,但这不是问题的一部分)。你可以认为这个要求使我的任务不真正是 fire-and-forget,这其中有一些道理,所以我想澄清这一点:
- 这些任务在本地上是 fire-and-forget 的,因为启动它们的方法对它们的结果不感兴趣。
- 这些任务在全局上不是 fire-and-forget 的,因为整个应用程序关心它们。
static class Program
{
static async Task Main(string[] args)
{
_ = Log("Starting"); // fire and forget
await Task.Delay(1000); // Simulate the main asynchronous workload
CleanUp();
_ = Log("Finished"); // fire and forget
// Here any pending fire and forget operations should be awaited somehow
}
private static void CleanUp()
{
_ = Log("CleanUp started"); // fire and forget
Thread.Sleep(200); // Simulate some synchronous operation
_ = Log("CleanUp completed"); // fire and forget
}
private static async Task Log(string message)
{
await Task.Delay(100); // Simulate an async I/O operation required for logging
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} {message}");
}
}
输出:
11:14:11.441 Starting
11:14:12.484 CleanUp started
Press any key to continue . . .
“CleanUp completed”和“Finished”条目没有被记录,因为应用程序过早终止,并且待处理任务被中止。有没有办法在关闭之前等待它们完成?
顺便说一下,这个问题是受到@SHAFEESPS的一个 最近的问题 的启发的,但很遗憾被关闭了。
澄清一下:上面提供的最小示例包含一种类型的fire-and-forget操作,即Task Log方法。真实世界应用程序启动的fire-and-forget操作是多样化的,有些甚至返回通用任务,如Task或Task。
还可能出现一个fire-and-forget任务会触发次要的fire-and-forget任务,这些也应该被允许开始并等待。