none
请教 AutoResetEvent 类的理解 RRS feed

  • 问题

  • 在msdn上看了AutoResetEvent 类的介绍,但是还是没法理解,请教谁能举个通俗易懂的例子帮助理解一下。
    2010年2月23日 6:15

答案

  • 我试着举一个例子吧,欢迎讨论。

    在一个伸手不见五指的黑夜,一条路上有一盏路灯,只有这个路灯亮的时候,人们才敢穿过这条马路。
    在某一时刻,这盏路灯是不亮的,因此想通过这条马路的人,都不得不在马路的一头等待,等待着它亮,在另外一个时刻,神秘力量(上帝?神仙?)点亮了这盏灯,于是等待的人们,就穿过了马路。然后,注意,这里就是Auto和非Auto的区别,人们穿过马路之后,这盏路灯,就自动关闭了,也就是说,如果是Auto,只要有人穿过了马路,它就会自动关闭(不是Auto就不会自动关闭)。后续再来的人,只能继续等待这个灯下一次的闪亮。
    以上是灯关闭的时候有人等待的情况。
    还有一种情况,就是,在某一时刻,没有人在等待穿过马路,但是那股神秘力量,打开了路灯,这时候,路灯会持续保持亮着,直到,有一个人要穿过马路,他很幸运,因为他来到马路的时候,灯已经是亮着的,所以不需要等待,就直接穿过去了,而因为这个灯是Auto的,因此当他穿过之后,灯就会灭掉。


    理解的越多,需要记忆的就越少
    2010年2月23日 7:23
    版主
  • 你好!
          这个类就是给自动重置事件提供支持的,WaitOne方法阻塞当前线程,等待触发,然后用Set方法触发那个线程!文档中翻译的有一些问题,可能给你的理解造成了阻碍,你可以看看英文的文档:
    http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx
    中文文档是这样的:

    AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

    线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。

    调用 Set AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

    如果 当 AutoResetEvent 为终止状态时线程调用 WaitOne , 则线程不会被阻止。AutoResetEvent 将立即释放线程并返回到非终止状态。

    英文的原文是这样的:

    AutoResetEvent allows threads to communicate with each other by signaling. Typically, this communication concerns a resource to which threads need exclusive access.

    A thread waits for a signal by calling WaitOne on the AutoResetEvent . If the AutoResetEvent is in the non-signaled state, the thread blocks, waiting for the thread that currently controls the resource to signal that the resource is available by calling Set .

    Calling Set signals AutoResetEvent to release a waiting thread. AutoResetEvent remains signaled until a single waiting thread is released, and then automatically returns to the non-signaled state. If no threads are waiting, the state remains signaled indefinitely.

    If a thread calls WaitOne while the AutoResetEvent is in the signaled state, the thread does not block. The AutoResetEvent releases the thread immediately and returns to the non-signaled state.

    其中non-signaled被翻译成“非终止”了,所以很难理解!翻译成“未触发”比较合适!
    周雪峰
    2010年2月23日 9:12
    版主

全部回复

  • 我试着举一个例子吧,欢迎讨论。

    在一个伸手不见五指的黑夜,一条路上有一盏路灯,只有这个路灯亮的时候,人们才敢穿过这条马路。
    在某一时刻,这盏路灯是不亮的,因此想通过这条马路的人,都不得不在马路的一头等待,等待着它亮,在另外一个时刻,神秘力量(上帝?神仙?)点亮了这盏灯,于是等待的人们,就穿过了马路。然后,注意,这里就是Auto和非Auto的区别,人们穿过马路之后,这盏路灯,就自动关闭了,也就是说,如果是Auto,只要有人穿过了马路,它就会自动关闭(不是Auto就不会自动关闭)。后续再来的人,只能继续等待这个灯下一次的闪亮。
    以上是灯关闭的时候有人等待的情况。
    还有一种情况,就是,在某一时刻,没有人在等待穿过马路,但是那股神秘力量,打开了路灯,这时候,路灯会持续保持亮着,直到,有一个人要穿过马路,他很幸运,因为他来到马路的时候,灯已经是亮着的,所以不需要等待,就直接穿过去了,而因为这个灯是Auto的,因此当他穿过之后,灯就会灭掉。


    理解的越多,需要记忆的就越少
    2010年2月23日 7:23
    版主
  • 你好!
          这个类就是给自动重置事件提供支持的,WaitOne方法阻塞当前线程,等待触发,然后用Set方法触发那个线程!文档中翻译的有一些问题,可能给你的理解造成了阻碍,你可以看看英文的文档:
    http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx
    中文文档是这样的:

    AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。

    线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。

    调用 Set AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

    如果 当 AutoResetEvent 为终止状态时线程调用 WaitOne , 则线程不会被阻止。AutoResetEvent 将立即释放线程并返回到非终止状态。

    英文的原文是这样的:

    AutoResetEvent allows threads to communicate with each other by signaling. Typically, this communication concerns a resource to which threads need exclusive access.

    A thread waits for a signal by calling WaitOne on the AutoResetEvent . If the AutoResetEvent is in the non-signaled state, the thread blocks, waiting for the thread that currently controls the resource to signal that the resource is available by calling Set .

    Calling Set signals AutoResetEvent to release a waiting thread. AutoResetEvent remains signaled until a single waiting thread is released, and then automatically returns to the non-signaled state. If no threads are waiting, the state remains signaled indefinitely.

    If a thread calls WaitOne while the AutoResetEvent is in the signaled state, the thread does not block. The AutoResetEvent releases the thread immediately and returns to the non-signaled state.

    其中non-signaled被翻译成“非终止”了,所以很难理解!翻译成“未触发”比较合适!
    周雪峰
    2010年2月23日 9:12
    版主