在正常情况下,应该不可能访问在TimerCallback函数的主线程上分配的属性值,对吗?
我有一个使用计时器的类,这个类有一个用于TimerCallback的方法,嗯,我访问这个方法的属性就像没有多线程一样(我看到在主线程上分配的值)
如果有必要,我会粘贴一些代码,但我首先想知道我是否在计时器方面有重大混淆。
谢谢
发布于 2011-08-03 03:09:05
在TimerCallback函数上,应该不能访问主线程上分配的属性值,对吧?
?
不对!这只是当你使用依赖于主线程的UI时,例如当使用winforms和WPF,甚至一些组件时,你只能从他们在上创建的线程访问它的成员,无论它是否在主线程的位置。
但是,对于您构建的自定义类,哪个线程访问成员并不重要,也就是说,任何线程都可以访问该类及其成员,无论它是否位于创建该类的线程中。
发布于 2011-08-03 03:10:12
除非是从创建UI对象的线程(通常是主线程)访问,否则不应该访问UI对象。如果你这样做了,它可能会工作,但你冒着抛出异常的风险,或者更糟糕的是,事情会默默地中断。
任何线程在任何时候都可以访问其他对象,而不会抛出任何异常;但是,您仍然必须小心避免并发情况。例如,如果您有以下代码来创建单例:
class Unique {
private static Unique instance;
public static Unique Instance {
get {
if (instance == null) {
instance = new Unique();
}
return instance;
}
}
}然后,如果两个线程同时访问Instance属性,它们最终都可能创建一个新的单例实例(因为它们都可以并行地进入if )。
避免这些情况的最简单方法之一是使用锁定:
lock (AnyObject) {
// Any other code locking on the same object cannot run while this code runs
}发布于 2011-08-03 03:10:29
来自System.Timers.Timer的文档
如果将计时器与用户界面元素(如窗体或控件)一起使用,而没有将计时器放置在该用户界面元素上,请将包含计时器的窗体或控件分配给SynchronizingObject属性,以便将事件封送到用户界面线程。
https://stackoverflow.com/questions/6917187
复制相似问题