private void timer1_Tick(object sender, EventArgs e)
{
lock (this)
{
i++;
Application.DoEvents();
Thread.Sleep(20000);
}
}
假设Timer定时是1秒,Timer变成异步的了,并且lock也没有起作用,i++在不停地增加,根本没有停留20秒, 这是因为Application.DoEvents()从消息循环中获得了下一个Timer事件消息,而且触发所有Timer都是程序的同一个主线程,所以lock没有起到锁住的作用。
反之不管是Timer或其他控件事件同线程或线程触发的事件或者多个线程或线程触发的事件之间共同访问一个全局变量,都是异步的并且lock是有效的。