【发布时间】:2022-11-22 05:55:16
【问题描述】:
我有一个创建一些任务的程序,这些任务中的每一个每约 100 毫秒从各种 PLC 中提取数据,并且每秒存储它们的最新值(同时对数据执行一些低级监控任务)。这里的要点是为它要监视的数据部分设置每个任务,并启动每个任务以记录和监视,然后定期(每 5 秒 1 次)检查以确保它们仍在运行,并尝试恢复任何错误的任务。
出于日志记录的目的,我希望能够以一种既可以被程序的主要功能引用也可以直接在任务内部引用的方式在创建时命名任务,以帮助跟踪哪个线程正在做什么,理想情况下以人类可读的方式(我并不特别关心事件登录的“气压”线程的哪个实例,只是它来自“气压”线程,因为每个实例都将根据确切的数据唯一命名,以及从哪里进行管理)。
我对 C# 还是很陌生,所以我完全有可能把整件事搞得一团糟,但是除了使用线程的 ID 之外,我还没有发现任何能让我轻松识别任务的东西(但这使得人类-可读性有点不太理想)。
我目前的解决方案只给我来自主函数的数据——我使用一个 NamedTask 类,它有一个 (String) 名称、一个 (Action) Action、一个 (Task?) Task 和 (int) Restarts(Task 有多少次已重新启动),这给了我一个很好的主函数可靠的命名选项,但我还没有想出一种方法将它带到任务本身(除了向我以这种方式启动的所有函数添加“名称”参数之外) .
【问题讨论】:
-
我认为你误解了
Task的目的。 -
您可以创建一个
Dictionary<string, Task>,其中键是您为每个Task指定的名称,值是属于该名称的Task。 -
@Dai 完全有可能!我原本考虑过简单的线程,看起来可以命名,但我还需要一种方法来杀死共享连接的相关监视器,以在主程序级别重新启动连接,然后重新启动相关线程,然后不是向我找到的线程发出信号的方法
-
任务和线程不是一回事。虽然是任务能够在不同的线程上启动,它也有可能与另一个任务在同一线程上启动。任务本身并不意味着长时间运行,因此如果您有此意图,则应在创建任务时使用 TaskCreationOptions.LongRunning 选项。至于存储它们,只需创建一个
Dictionary<string, Task>(ConcurrentDictionary,如果它将被多个任务访问)。 -
没有人需要直接使用
Thread了,顺便说一句。
标签: c#