【问题标题】:Can I set Thread.CurrentThread.Name in Parallel.ForEach?我可以在 Parallel.ForEach 中设置 Thread.CurrentThread.Name 吗?
【发布时间】:2018-04-04 14:05:20
【问题描述】:

我正在使用以下 C# 代码来处理请求。

Parallel.ForEach(reqs, parallelOptions, req => ProcesRequest(req));

在 ProcesRequest 方法中我可以设置线程名称。见以下代码:

Thread.CurrentThread.Name = "Some name with " + i;

请建议上面的代码是否会给出一致的线程名称。

写这样的代码可以吗。它会影响创建大量线程的时间吗?

内部是否有任何线程重用发生?

【问题讨论】:

  • “此属性是一次写入的”。不要给不是你自己明确创建的线程命名——你无法控制Parallel.ForEach 的作用。
  • 亲自尝试会不会更快?
  • Parallel.ForEach 正在使用线程池。您从池中“借用”线程来完成您的工作。正如入住酒店并在门上潦草地写下你的名字是不礼貌的一样,代码表现得好像它拥有只是借来的东西一样也是不礼貌的。
  • @Evk:各种记录器框架打印线程名称。我想利用记录器的这些功能。因此我想设置线程名称。
  • 任何值得一提的记录器框架都会有一个可以用于此的自定义上下文类,如log4net.ThreadContext。如果你不这样做,那么你最好明确说明你记录的内容,而不是依赖环境属性——即使它们有效,它们也容易出错。

标签: c# multithreading task-parallel-library


【解决方案1】:

最好的方法是使用Thread.CurrentThread.ManagedThreadId

ParallelOptions pOpt = new ParallelOptions()
{
    MaxDegreeOfParallelism = 10
};

Parallel.ForEach(reqs, pOpt, req=> {
    string thName = "Thread#"  + Thread.CurrentThread.ManagedThreadId;
    Console.WriteLine(thName);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2011-02-05
    • 2013-12-04
    • 1970-01-01
    • 2021-08-16
    • 2011-06-30
    相关资源
    最近更新 更多