等待任务完成
Waiting for task to be finished
我正在粘贴我编写的 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
中创建的所有任务,即执行 TaskMethod1
的任务。
我有以下问题:
- 如何让服务等待使用
Task.Run(() => TaskMethod1(arg1);
创建的任务。(请注意,可能有多个为 [=14=] 创建的任务,但 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
并继续前进。那里没有任何东西告诉它等待任何事情。除非你在从 Task.Run
返回的 Task
上 await
或 .Wait()
,否则你的代码只是继续 运行,而不依赖于 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
。
我正在粘贴我编写的 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
中创建的所有任务,即执行 TaskMethod1
的任务。
我有以下问题:
- 如何让服务等待使用
Task.Run(() => TaskMethod1(arg1);
创建的任务。(请注意,可能有多个为 [=14=] 创建的任务,但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
并继续前进。那里没有任何东西告诉它等待任何事情。除非你在从Task.Run
返回的Task
上await
或.Wait()
,否则你的代码只是继续 运行,而不依赖于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
。