【问题标题】:C# System.Timers.Timer how to name its threadC# System.Timers.Timer 如何为其线程命名
【发布时间】:2015-03-04 12:32:36
【问题描述】:

这是我的主要方法:

   public static void main(){
        var timer1=createDebounceTimer("TIMER1");
        var timer2=createDebounceTimer("TIMER2");
    }

这是我的计时器构建代码:

    private System.Timers.Timer createDebounceTimer(string threadName){
        var debounceTimer = new System.Timers.Timer(debounce * 1000);
        debounceTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        debounceTimer.AutoReset = false;
        //here I need to name the timer with threadName var
        return debounceTimer;
    }

这是一个简单的 elapse 事件:

    private void OnTimedEvent(object source, ElapsedEventArgs e)
       log.Info("My log system need the name of my thread");
    }

问题 1:

如何给定时器的线程命名?我需要这个来记录日志,详细来说我想命名 Elapsed 事件的线程。

问题 2:

如果创建多个计时器,我能否确定每个计时器会有一个专用线程

【问题讨论】:

  • 您可以从 System.Timers.Timer 继承并添加您自己的属性(名称)。
  • 在线程池线程上调用 Elapsed 事件处理程序。您无法保证下次它会是完全相同的线程。如果这很重要,那么您需要停止使用 Timer 类,并使用在调用 Sleep() 时循环的 Thread 类自己做点什么。这是不明智的,线程是非常昂贵的对象。

标签: c# multithreading logging timer


【解决方案1】:

我也想知道这个。不知道这是怎么回事,但为什么不做这样的事情:

private void OnTimedEvent(object source, ElapsedEventArgs e)
   System.Threading.Thread.CurrentThread.Name = "CustomThreadName-" + System.Threading.Thread.CurrentThread.ManagedThreadId;
   log.Info("My log system need the name of my thread");
}

在conversionPattern 中使用'%thread' 时,Log4Net 将忠实地在日志中显示“CustomThreadName-...”。 ManagedThreadId 至少会在您的日志中为您提供唯一性。

【讨论】:

  • 附录:应用这个时,我收到错误“System.InvalidOperationException:Thread.Name 只能设置一次。”原因:每次调用定时器回调时设置。所以在使用这个建议的解决方案时要注意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2011-03-21
  • 2011-06-20
  • 2018-01-03
相关资源
最近更新 更多