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