gpt4 book ai didi

c# - Timers Event 的委托(delegate)是否作为线程安全进程调用?

转载 作者:行者123 更新时间:2023-11-30 15:01:32 25 4
gpt4 key购买 nike

我有 2 个计时器 ( System.Timers.Timer ) 正在运行,两个计时器 Elapsed-Events 都有代表订阅。两种方法(在订阅的委托(delegate)中)都在处理相同的对象(例如列表和列表中的对象)。

假设计时器 Elapsed-Events 被调用同时

委托(delegate)会在不同的线程中运行吗?或者他们会一个接一个地被调用?我应该使代码线程安全并使用锁吗?

最佳答案

我假设您指的是 System.Timers.Timer而不是 System.Windows.Forms.Timer .正如文档所说:

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

没有什么可以保证两个不同的线程不会为两个不同的计时器引发 Elapsed 事件。最好使您的代码线程安全。

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

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();

关于c# - Timers Event 的委托(delegate)是否作为线程安全进程调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com