【问题标题】:Name a C# Task to be Referenced In and Out of Task命名要在任务中和任务外引用的 C# 任务
【发布时间】: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#


【解决方案1】:

一个任务实际上只是一个线程来做工作。您需要创建和管理您要在线程中执行的操作。有很多方法可以做到这一点。这实际上取决于您的用例。您需要确定监控 PLC 的顶层。从他们那里,您可以通过创建该部分数据的该类型的类来分解工作。在实例定义中,您需要指定它的标识(元数据)。然后你会启动一个线程来执行工作。这是基于一些假设,您需要真正设计并理解您真正想做什么以及为什么需要这样做。

【讨论】:

  • “一个任务真的只是一个线程来做工作。”- 这种说法是不真实的。 Task 对象不代表 Thread
  • “然后你会启动一个线程来执行工作”- 这是个糟糕的建议:没有充分的理由再在用户代码中启动新线程(而且你的(操作系统管理的)线程永远不应该超过你的计算机拥有的线程)硬件线程(即 CPU 内核),否则你就是效率低下)——所谓的“绿色线程”或“纤程”是不同的,但 C#/.NET 使用不同的协程表示形式,这没有实际意义)
猜你喜欢
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多