【问题标题】:How can I query for a Task the Thread如何查询线程中的任务
【发布时间】:2021-10-30 00:28:03
【问题描述】:

我的目标是给执行任务的线程一个名字,例如“工人为XY”。但我不想在任务中命名线程。

什么有效,但我不想要:

Task.Factory.StartNew(() =>
    {
       Thread.CurrentThread.Name = $"WorkerFor{taskName}";
       // some code
    }, TaskCreationOptions.LongRunning);

我想做什么:

var task = Task.Factory.StartNew(() =>
    {
       // some code
    }, TaskCreationOptions.LongRunning);
task.GetAssignedWorkerThreadIfAvailable().Name = $"WorkerFor{taskName}";    // or something similar

我认为可能有一个解决方案,因为 Visual Studio 可以创建这样的映射:

【问题讨论】:

  • 为什么需要为线程分配名称? :) 我必须在我的应用程序中识别要与数据库通信的线程,以防止同时调用数据库。我使用了一个 Semaphore 对象,我为其分配了一个名称。然后,我可以打开现有的信号量,并在具有此名称的前一个线程已完成时阻止或允许任务继续进行。如果这听起来像您的问题,请告诉我,我可以发布代码。
  • @DaniëlHoffman 感谢您的建议,但我需要为高级日志记录(ThreadId、TaskId 以及如果可能的话还有 ThreadName 的日志记录)和调试命名。对于任务同步,我不需要名称。
  • 您在线程分配中看到的线程 ID 是由 AppDomain.GetCurrentThreadId() 返回的,正如您所见,它在托管代码中已被弃用(因为轻量级线程),而是支持 ManagedThreadId。没有人阻止您将 Task.Id 分配给 ConcurrentDictionary<int, [Task Descriptor Class]>,类对象在其中存储您可能需要的信息。
  • 一个任务可能有也可能没有线程,也可能有多个。我不认为你想要做的事情是实际的或现实的。
  • 您是否考虑过使用专门构建的系统,例如HangfireQuartzFluentScheduler 等?

标签: c# .net multithreading task task-parallel-library


【解决方案1】:

任务概念是对“低级”线程概念的抽象(请参阅更多https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl),因此尝试通过任务实例获取或设置线程属性不是一个合适的决定(您可以查看该问题以了解更多信息) How to get the reference of TPL task's thread in C#?)

我的建议只是将任务名称作为输入参数传递,特别是如果它只是出于日志记录的原因。

【讨论】:

  • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多