关于System.Timers.Timer的困惑

时间:2011-08-02 19:03:43

标签: c# .net timer

在正常情况下,不应该可以访问TimerCallback函数主线程上分配的属性值,对吗?

我有一个使用计时器的类,这个类有一个TimerCallback的方法,好吧,我访问这个方法的属性,好像没有多线程一样(我看到在主线程上分配的值)

如果有必要,我会粘贴一些代码,但我想知道我是否对计时器有很大的困惑。

由于

3 个答案:

答案 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属性,以便事件为编组到用户界面线程。