c# - 等待任务完成
问题描述
我正在粘贴我编写的一段 Windows 服务。为了完成任务,我将默认服务终止时间更改为 30 分钟。
private static void TaskMethod1()
{
//I am doing a bunch of operations here, all of them can be replaced with a sleep for 25 minutes
}
private static async Task TaskMethod()
{
while(runningService)
{
// Thi will create more than one task in parallel to run and each task can take upto 30 minutes to finish
Task.Run(() => TaskMethod1(arg1);
}
}
internal static void Start()
{
runningService = true;
Task1 = Task.Run(() => TaskMethod());
}
internal static void Stop()
{
runningService = false;
Task1.Wait();
}
在上面的代码中,我写Task1.wait()
了等待 task1 完成而不是等待在TaskMethod
ie tasks execution 中创建的所有任务TaskMethod1
。我有以下问题:
- 如何使服务等待使用创建的任务
Task.Run(() => TaskMethod1(arg1);
。(请注意,可能创建了多个任务Task.Run(() => TaskMethod1(arg1);
但Task1 = Task.Run(() => TaskMethod());
只运行一次。) - 当我运行时,
Task1.wait()
为什么它不等待作为该任务的一部分创建的所有任务?
解决方案
- 您必须跟踪您创建的任务,以便以后能够引用它们。例如:
private static List<Task> _taskList = new List<Task>();
private static void TaskMethod()
{
while(runningService)
{
// This will create more than one task in parallel to run and each task can take upto 30 minutes to finish
_taskList.Add(Task.Run(() => TaskMethod1(arg1)));
}
}
internal static void Stop()
{
runningService = false;
Task.WaitAll(_taskList.ToArray());
Task1.Wait();
}
- 因为
Task1
不依赖于其他任务的完成。在TaskMethod()
中,您只是在创建Task
并继续前进。那里没有任何东西告诉它等待任何东西。除非您await
或返回 from ,否则您.Wait()
的代码将继续运行,而不依赖于您刚刚创建的。Task
Task.Run
Task
这是我在您的代码中看到的问题。您的while(runningService)
循环将以 CPU 允许的速度循环,在几秒钟内创建数千个新任务。你确定那是你想要的吗?
也许您希望它在循环内等待它完成,然后再循环并开始一个新循环?如果我是正确的,那么你的循环应该是这样的:
private static async Task TaskMethod()
{
while(runningService)
{
// This will create more than one task in parallel to run and each task can take upto 30 minutes to finish
await Task.Run(() => TaskMethod1(arg1));
}
}
但这一次只能创建一个Task
。
推荐阅读
- android - 如何阅读 Koin factory DSL 中的 lambda 语法?
- terminal - Manjaro (dwm) 上的终端显示“”而不是
- flutter - 在 Flutter 中与 miniplayer 一起使用时,BetterPlayer 会在全屏时引发错误
- reactjs - 是否可以在 React 中的 2 个功能组件之间传递数据?
- django - 无法让 Django 在 k8s 中与 Postgres 对话
- javascript - 异步函数测试抛出 regeneratorRuntime 错误
- node.js - MongoDB watch 随机崩溃(Cursor session id 与操作上下文的 session id 不一样)
- blazor - 可以在 blazor 路由中自定义路由约束吗
- java - 如何列出
和 List在这些例子中有什么不同? - javascript - Laravel 将生成的 Pdf 保存在队列中