方法是顺序执行的吗?

sherwinzhubuaa 2007-06-13 10:02:29
假设有一个类A,它有2个方法M1,M2。M1因为定时器会周期性的执行,M2由用户操作引发执行。
问题是,程序执行的时候,一定会保证M1,M2的执行顺序吗?M1 M2或M2 M1,就像事务调度一样。
会不会在M2执行的过程中,M1开始执行呢?
如果Dotnet自身并不这样保证,那么怎么才能够实现这种需求呢?
如果是多线程,可以使用通过对象锁定进行线程同步,现在遇到的情况是M1,M2 均在一个线程中执行?

不知道谁有这方面的经验,谢谢指教!
...全文
225 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivony 2007-06-13
  • 打赏
  • 举报
回复
你直接在M2/M1一开始判断M1/M2是否存在,存在就Join它,这样就保证顺序了……
phommy 2007-06-13
  • 打赏
  • 举报
回复
当我做了以下修改时,我的机器很不争气的死掉了...

private void timer1_Tick(object sender, EventArgs e)
{
while(true) Application.DoEvents();
}
phommy 2007-06-13
  • 打赏
  • 举报
回复
做了个实验,当一个方法在进行中的时候,Timer事件是不会触发的。
但如果在进行中的方法中调用了Application.DoEvents(),则在此处阻塞并触发Timer事件(如果事件发生了的话),处理完事件再回来继续执行

private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
while (this!=null)
//Application.DoEvents() ;
return;
}

private void timer1_Tick(object sender, EventArgs e)
{
this.Text += "1";
}
whslovexyp 2007-06-13
  • 打赏
  • 举报
回复
在同一个线程上的话你不需要lock,但现在是不同的线程操作同一个数据,因此要lock,正是你所想的lock(object)
sherwinzhubuaa 2007-06-13
  • 打赏
  • 举报
回复
@shilei831115
加入M1,M2会操作同一个数据,如M1,M2同时对数组进行修改操作,这样就有可能出问题了。
sherwinzhubuaa 2007-06-13
  • 打赏
  • 举报
回复
@seonxp
将M1,M2设置为互斥事件就可以解决你的问题。例如:设置bool locked

具体是怎么做的,我不太明白。
你指的是lock(object)?,问题是M1,M2被在同一个线程执行时,lock好像不行。
shilei831115 2007-06-13
  • 打赏
  • 举报
回复
多线程执行同一个方法又不会损坏数据,或者锁定数据,执行顺序莫非非要考虑进去吗
seonxp 2007-06-13
  • 打赏
  • 举报
回复
由于线程调度,确实会发生M1执行一半然后执行M2的情况,所以没有办法确保他们之间的顺序,但是你可以通过将M1,M2设置为互斥事件就可以解决你的问题。例如:设置bool locked,当M1,M2事件中的一个执行时,锁定 locked,执行完解锁。关于互斥,可以参考MSDN和操作系统的相关内容。
sherwinzhubuaa 2007-06-13
  • 打赏
  • 举报
回复
一个线程同时只能做一件事,所以M1和M2不会同时被执行的!

会不会M1方法执行到一半(如果有10条语句,执行到第5条),开始执行M2 ,M2 完成后,再执行M1剩下的一般呢?
whslovexyp 2007-06-13
  • 打赏
  • 举报
回复
M1在线程池的线程中,M2在UI线程中,不会有执行顺序问题。
commandosvvv 2007-06-13
  • 打赏
  • 举报
回复
up!
定时器控制的方法m1,
还是取决于这个定时器是否单独另开了一个线程,
如果是的话,才有可能m1,m2同时在执行,
如果不是,那当然要看进程执行时调用的先后顺序,而不是定义的先后顺序。
wzd24 2007-06-13
  • 打赏
  • 举报
回复
一个线程同时只能做一件事,所以M1和M2不会同时被执行的!
wzd24 2007-06-13
  • 打赏
  • 举报
回复
Form命名空间下面的Timer组件引发的事件是在主线程执行的。所以不会出现线程冲突,楼主不需要担心这个问题。
aSalt 2007-06-13
  • 打赏
  • 举报
回复
JF
sherwinzhubuaa 2007-06-13
  • 打赏
  • 举报
回复
@Ivony
你直接在M2/M1一开始判断M1/M2是否存在,存在就Join它,
没有明白你说的意思

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧