【发布时间】:2021-10-18 08:51:23
【问题描述】:
我正在使用System.Threading.Timer 异步重复某个任务。当任务准备就绪时,应该执行原始线程(调用Start())上的一个方法。
public event EventHandler StatusChanged;
public void Start()
{
StatusChanged += new EventHandler(SomethingChangedMethod);
new Timer(Pending, null, 0, 1000);
}
private void Pending(object state)
{
//Do Something
StatusChanged?.Invoke(this, EventArgs.Empty);
}
由于我不在控制或其他东西上,我不能打电话给Invoke()或BeginInvoke()。
【问题讨论】:
-
原线程是什么线程?它是 UI 线程、
ThreadPool线程,还是使用Thread构造函数手动启动的? -
由于可以从库外部调用 Start(),因此我无法真正控制它。
-
或者是用户必须在他的“SomethingChangedMethod”中关心的事情(例如,在控件上使用“BeginInvoke()”)
-
附带说明,如果我站在你的立场上,我会非常担心允许未知代码在周期性
Timer的回调上运行。该组件不提供针对回调重叠调用的保护。不仅未知代码可能无法为并发做好准备,而且您最终可能会遇到越来越多的并发执行,从而导致资源耗尽和ThreadPool饥饿。您可以查看this 问题以获取解决方案。 -
是的,行得通。如果我使用 awaited 方法的返回(在我的情况下只是一个布尔值),如果需要,我可以直接从
Start()调用Invoke()。这也解决了正确线程的初始问题。再次感谢您的帮助。
标签: c# multithreading asynchronous event-handling