【发布时间】:2022-02-02 09:22:30
【问题描述】:
我正在尝试创建一个系统来处理作为单独任务进入的事件。这一切都在一个 Windows 服务应用程序中运行,直到它停止,当停止时,等到所有任务完成后再停止。
我有以下简化的代码:
IList<Task> _tasks = new List<Task>();//this is a private class variable.
private void Event_Fired(object sender, eventArgs e)
{
StartTask();
}
private void StartTask(){
Task task = Task.Factory.StartNew(async () => await process.ProcessEvent(true, StoppingToken));
_tasks.Add(task);
}
private void MonitorTasks(){
for (int i = _tasks.Count - 1; i >= 0; i--)
{
Task aTask = _laneTasks[i];
if (aTask.IsCompleted)
{
_tasks.Remove(aTask);
Log.Information($"Task {aTask.Id} completed.");
}
}
}
public async Task ProcessEvent(){
//do some async processing
await Task.Delay(5000); //if I add a delay before returning the Task, it is completed prior to this delay.
}
我遇到的问题是任务在 ProcessEvent 完成之前完成。在允许进程停止之前,我需要确保任务已完成。
该过程还必须允许新事件随时进入并产生新任务。
我觉得我在这里遗漏了一些基本的东西。任何帮助将不胜感激。
【问题讨论】:
-
旁注:开始任务只是为了开始一个任务是超级混乱......考虑不这样做。
-
阿列克谢的意思是你可以这样做:
Task task = process.ProcessEvent();(注意没有await) -
另外,在
ProcessEvent之前完成了哪个任务?你是如何确定的? -
这有点难以用语言表达...抓住你最喜欢的橡皮鸭并在
Task.Factory.StartNew(async () => await ...代码行中解释它(首先阅读文档)。特别注意内部任务会发生什么......并且可能阅读“C#中热任务与冷任务的含义”。 -
“启动 ProcessEvent 的任务在返回之前完成” - 你怎么知道的?
标签: c# events async-await task