C# 是计时器事件';s委托作为线程安全进程调用?

C# 是计时器事件';s委托作为线程安全进程调用?,c#,multithreading,timer,thread-safety,C#,Multithreading,Timer,Thread Safety,我有2个计时器正在运行,两个计时器经过的事件都已订阅。这两种方法(在订阅的委托中)都处理相同的对象(例如列表和列表中的对象) 假设计时器运行事件同时被调用 代理将在不同的线程中运行吗?或者他们会被一个接一个地叫来? 我应该使代码线程安全,并使用锁吗?它们将作为线程池中的工作项排队,因此,是的,它们有并发执行的风险。确保不会发生这种情况的一种方法是只安排一次计时器回调和循环时间(System.Threading.timer支持此功能),并在工作完成时重新安排时间。我假设您参考了而不是。正如文件所说

我有2个计时器正在运行,两个计时器经过的事件都已订阅。这两种方法(在订阅的委托中)都处理相同的对象(例如列表和列表中的对象)

假设计时器运行事件同时被调用

代理将在不同的线程中运行吗?或者他们会被一个接一个地叫来?
我应该使代码线程安全,并使用锁吗?

它们将作为线程池中的工作项排队,因此,是的,它们有并发执行的风险。确保不会发生这种情况的一种方法是只安排一次计时器回调和循环时间(
System.Threading.timer
支持此功能),并在工作完成时重新安排时间。

我假设您参考了而不是。正如文件所说:

基于服务器的计时器设计用于多线程环境中的工作线程。服务器计时器可以在线程之间移动以处理引发的已用事件,从而在按时引发事件方面比Windows计时器更准确

没有任何东西可以保证两个不同的线程不会为两个不同的计时器引发
appeased
事件。最好使代码线程安全

我添加了一个简短的代码片段,以显示可以同时调用
appeated
的多个回调(在这种情况下,会导致死锁--
Debug.WriteLine

计时器回调(您不指定特定的类/命名空间)总是在单独的线程中调用。所以你应该让你的代码线程安全。 它们将被称为“同时”还是随后偏离航线取决于它们的间隔设置。

对于相同的间隔集,将首先调用哪个回调几乎是不确定的。

您所说的是哪个
Timer
类如果SynchronizingObject属性为null,则在线程池线程上引发已用事件。如果已用事件的处理持续时间超过间隔,则可能会在另一个线程池线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。”这并不能准确地描述您的情况,但很好地说明了事件没有在同一线程中排队。其目的是:
var _lock = new object();
GC.KeepAlive(_lock);
var timer1 = new Timer(100);
var timer2 = new Timer(200);
timer1.Elapsed += delegate
{
    lock (_lock)
        Thread.Sleep(-1);
};
timer2.Elapsed += delegate
{
    lock (_lock)
        Debug.WriteLine("Hello world.");
};
timer1.Start();
timer2.Start();