在正常情况下,不应该可以访问TimerCallback函数主线程上分配的属性值,对吗?
我有一个使用计时器的类,这个类有一个TimerCallback的方法,好吧,我访问这个方法的属性,好像没有多线程一样(我看到在主线程上分配的值)
如果有必要,我会粘贴一些代码,但我想知道我是否对计时器有很大的困惑。
由于
答案 0 :(得分:2)
应该无法访问TimerCallback函数上主线程上分配的属性值,对吗?
错误!这只是当你使用依赖主线程的UI时,例如当使用winforms UI和WPF甚至一些COM组件时,你只能从他们在上创建的线程访问其成员,no如果主线是否在哪里。
但是对于您构建的自定义类,哪个线程访问该成员并不重要,也就是说,任何线程都可以访问该类及其成员,无论它在创建该类的线程上的位置。
答案 1 :(得分:2)
除了从创建它们的线程(通常是主线程)之外,您不应该访问UI对象。如果你这样做,可能可以工作,但你冒着抛出异常的风险,或者更糟糕的是,事情会无声地破坏。
任何线程都可以随时访问其他对象,不会抛出任何异常;但是你仍然要小心避免并发情况。例如,如果您有此代码来创建单例:
class Unique {
private static Unique instance;
public static Unique Instance {
get {
if (instance == null) {
instance = new Unique();
}
return instance;
}
}
}
然后,如果两个线程同时访问Instance
属性,他们可以两个最终创建一个新的单例实例(因为他们都可以进入{{1}并行)。
避免这些情况的最简单方法之一是使用锁定:
if
答案 2 :(得分:2)
来自System.Timers.Timer的文档:
如果将Timer与用户界面元素(如表单或控件)一起使用,而不将计时器放在该用户界面元素上,请将包含Timer的表单或控件分配给SynchronizingObject属性,以便事件为编组到用户界面线程。