永发信息网

C# Timer lock 多线程 的几点疑问。

答案:2  悬赏:60  手机版
解决时间 2021-01-26 07:16
  • 提问者网友:棒棒糖
  • 2021-01-25 23:31
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的特殊,还是状态栏的特殊,还是怎么回事?
最佳答案
  • 五星知识达人网友:青灯有味
  • 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楼网友:迟山
  • 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,但实际上可能不止。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯