WaitHandle.WaitOne 方法 ()

本文介绍了 .NET Framework 中 WaitHandle 类的 WaitOne 方法,详细解释了其在不同线程同步场景下的作用及使用方式,并提供了示例代码来演示如何在实际应用中使用此方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WaitHandle.WaitOne 方法 ()

当在派生类中重写时,阻塞当前线程,直到当前的 WaitHandle 收到信号。

命名空间:System.Threading
程序集:mscorlib(在 mscorlib.dll 中)

C#
C++
VB
public virtual bool WaitOne ()
J#
public boolean WaitOne ()
JScript
public function WaitOne () : boolean

返回值
如果当前实例收到信号,则为 true。如果当前实例永远收不到信号,则 WaitOne 永不返回。

异常类型条件

ObjectDisposedException

当前实例已被释放。

AbandonedMutexException

由于线程退出时未释放 mutex,导致等待过程结束。在 Windows 98 或 Windows Millennium Edition 中不引发此异常。

AbandonedMutexException 是 .NET Framework 2.0 版中新增的。在以前的版本中,如果放弃 Mutex,WaitOne 方法则返回 true。出现遗弃的 Mutex 表明存在严重的编码错误。该异常中包含的信息对调试很有帮助。

此方法的调用方无限期阻塞,直到当前实例收到信号。使用此方法一直阻止到 WaitHandle 收到来自另一个线程的信号,例如异步操作完成时生成的信号。有关更多信息,请参见 IAsyncResult 接口。

调用该重载等效于调用 WaitOne(Int32,Boolean) 方法重载,同时为第一个参数指定 -1 或 Timeout.Infinite,为第二个参数指定 false

重写此方法以自定义派生类的行为。

下面的代码示例说明在进程等待后台线程执行完时,如何使用等待句柄阻止进程终止。

C#
C++
VB
using System;
using System.Threading;

class WaitOne
{
    static AutoResetEvent autoEvent = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Main starting.");

        ThreadPool.QueueUserWorkItem(
            new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        autoEvent.WaitOne();
        Console.WriteLine("Work method signaled.\nMain ending.");
    }

    static void WorkMethod(object stateInfo) 
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep(new Random().Next(100, 2000));

        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)stateInfo).Set();
    }
}

J#
import System.*;
import System.Threading.*;
import System.Threading.Thread;

class WaitOne
{
    private static AutoResetEvent autoEvent = new AutoResetEvent(false);

    public static void main(String[] args)
    {
        Console.WriteLine("Main starting.");
        ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent);

        // Wait for work method to signal.
        autoEvent.WaitOne();
        Console.WriteLine("Work method signaled.\nMain ending.");
    } //main

    static void WorkMethod(Object stateInfo)
    {
        Console.WriteLine("Work starting.");

        // Simulate time spent working.
        Thread.Sleep((new Random()).Next(100, 2000));

        // Signal that work is finished.
        Console.WriteLine("Work ending.");
        ((AutoResetEvent)(stateInfo)).Set();
    } //WorkMethod
} //WaitOne

Windows 98、Windows 2000 SP4、Windows Millennium Edition、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求

.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0、1.0

社区附加资源

添加


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值