C# 中有三个Timer类,System.Windows.Forms.Timer,System.Threading.Timer,System.Timers.Timer。
1、只有后两个才算多线程,Forms.Timer是在主线程中执行,其运行时,暂停(中断)了主线程的其它部分,不算多线程。
2、lock 用于锁定一段程序,该程序在执行时,不会被其它线程(包括后两者Timer)中断。
问题:
1、上述描述是否正确?
2、既然 Forms.Timer不算多线程,如果窗体主线程中有一段代码被 lock ,那么 Forms.Timer会将其中断吗?还是等待这段代码执行完才执行其响应函数。
3、网上说 lock 一般与 static object 一起使用,为什么要 static 的 object,静态的有什么好处,不是静态的有什么影响?
4、跨线程调用窗体中的控件会出现线程安全问题,但我发现,跨线程设置状态栏上的 label的文本属性是没有问题的,是 label的特殊,还是状态栏的特殊,还是怎么回事?
C# Timer lock 多线程 的几点疑问。
答案:2 悬赏:60 手机版
解决时间 2021-01-26 07:16
- 提问者网友:棒棒糖
- 2021-01-25 23:31
最佳答案
- 五星知识达人网友:青灯有味
- 2021-01-25 23:49
您好..关于您的问题.
1>
第一个关于Forms.timer的描述正确
System.Windows.Forms.Timer是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的。也正是因为这个原因,导致了在Timer的 EventHandler里面进行长时间的阻塞调用,将会阻塞界面响应的后果。
第二个关于Lock
如果另外的线程并未使用到LOCK的对象.则双方之间没有任何阻塞,中段,等待的关系
2>Lock锁其实指的是以某一个变量为准.
如果你的另外一个线程,使用到了LOCK的对象,那么他会在LOCK代码段内的代码执行完毕后执行.
例如:
Lock(A)
{
//.....耗时10分钟的操作
}
线程B
XXXX
X
XXXX
A=C
XXXXX
如果执行到了A=C
那么下方的代码将不会被执行.当前的运行逻辑等待到了A=C这句话上.
等待LOCK的10分钟操作完毕后.继续执行
所以.如果窗体主线程中有一段代码被 lock ,那么 Forms.Timer会将其中断吗?还是等待这段代码执行完才执行其响应函数。
取决于你锁定了什么
例如你LOCK(THIS)
因为this在winform中指当前窗体,所以你就锁定了所有的THIS内的变量,控件.集体等待.也就是.LOCK会锁定对应变量/对象的继承关系
3>静态的有什么好处,不是静态的有什么影响?
请看第二问的答案.如果你看明白后你就会明白.
如果你LOCK的始终是一个new出来的对象.那么大家其实就等于没有锁.
因为我并没有使用你的对象.所以我不阻塞
4>跨线程调用窗体中的控件会出现线程安全问题,但我发现,跨线程设置状态栏上的 label的文本属性是没有问题的,是 label的特殊,还是状态栏的特殊,还是怎么回事?
状态栏的UI线程其实是他的父线程所属的.
当你要看某个控件是否符合线程 安全的情况.查阅对应对象是否存在INVOKE即可.
其实您的第4个问题我暂时并不敢给您肯定的回答.您的赋值代码我并不清楚.
按照理论来说.他并不特殊.虽然他没有对应invoke.
您用的是STATEXXXXX.LABEL控件吧.
如果还有其他问题.您可以继续追问.
望采纳.
Ths.
Ben.Lampson
1>
第一个关于Forms.timer的描述正确
System.Windows.Forms.Timer是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的。也正是因为这个原因,导致了在Timer的 EventHandler里面进行长时间的阻塞调用,将会阻塞界面响应的后果。
第二个关于Lock
如果另外的线程并未使用到LOCK的对象.则双方之间没有任何阻塞,中段,等待的关系
2>Lock锁其实指的是以某一个变量为准.
如果你的另外一个线程,使用到了LOCK的对象,那么他会在LOCK代码段内的代码执行完毕后执行.
例如:
Lock(A)
{
//.....耗时10分钟的操作
}
线程B
XXXX
X
XXXX
A=C
XXXXX
如果执行到了A=C
那么下方的代码将不会被执行.当前的运行逻辑等待到了A=C这句话上.
等待LOCK的10分钟操作完毕后.继续执行
所以.如果窗体主线程中有一段代码被 lock ,那么 Forms.Timer会将其中断吗?还是等待这段代码执行完才执行其响应函数。
取决于你锁定了什么
例如你LOCK(THIS)
因为this在winform中指当前窗体,所以你就锁定了所有的THIS内的变量,控件.集体等待.也就是.LOCK会锁定对应变量/对象的继承关系
3>静态的有什么好处,不是静态的有什么影响?
请看第二问的答案.如果你看明白后你就会明白.
如果你LOCK的始终是一个new出来的对象.那么大家其实就等于没有锁.
因为我并没有使用你的对象.所以我不阻塞
4>跨线程调用窗体中的控件会出现线程安全问题,但我发现,跨线程设置状态栏上的 label的文本属性是没有问题的,是 label的特殊,还是状态栏的特殊,还是怎么回事?
状态栏的UI线程其实是他的父线程所属的.
当你要看某个控件是否符合线程 安全的情况.查阅对应对象是否存在INVOKE即可.
其实您的第4个问题我暂时并不敢给您肯定的回答.您的赋值代码我并不清楚.
按照理论来说.他并不特殊.虽然他没有对应invoke.
您用的是STATEXXXXX.LABEL控件吧.
如果还有其他问题.您可以继续追问.
望采纳.
Ths.
Ben.Lampson
全部回答
- 1楼网友:迟山
- 2021-01-26 00:43
1. 大部分算是对了的,但是你似乎没明确lock的目的。
2. timer与lock似乎没什么关系
3. 因为lock就像钥匙,需要大家都可以访问、且唯一的属性
4. 你如何确定label属性没问题,恰恰相反,我可以给你写出有问题的程序。你可以定义个全局整数cnt,初始为0,开启n个线程,同时对label执行获取和设置Text属性的操作,设置前加个判断,假如其Text不为X,则赋为X,并让cnt++。最后理论上cnt只可能为1,但实际上可能不止。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯