この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

WaitHandle.WaitOne メソッド (Int32, Boolean)

 

公開日: 2016年10月

現在の WaitHandle がシグナルを受信するまで現在のスレッドをブロックします。時間間隔を指定するために 32 ビット符号付き整数を使用し、待機の前でも同期ドメインを終了するかどうかを指定します。

名前空間:   System.Threading
アセンブリ:  mscorlib (mscorlib.dll 内)

public virtual bool WaitOne(
	int millisecondsTimeout,
	bool exitContext
)

パラメーター

millisecondsTimeout
Type: System.Int32

待機するミリ秒数。無制限に待機する場合は Timeout.Infinite (-1)。

exitContext
Type: System.Boolean

待機する前にコンテキストの同期ドメインを終了し (同期されたコンテキスト内にいる場合)、後で再取得する場合は、true。それ以外の場合は false

戻り値

Type: System.Boolean

現在のインスタンスがシグナルを受け取る場合は true。それ以外の場合は false

Exception Condition
ObjectDisposedException

現在のインスタンスは既に破棄されています。

ArgumentOutOfRangeException

millisecondsTimeout は無限のタイムアウトを表す -1 以外の負の数です。

AbandonedMutexException

ミュー テックスを解放しないままスレッドが終了したため、待機が完了しました。 Windows 98 または Windows Millennium Edition では、この例外はスローされません。

InvalidOperationException

現在のインスタンスが透過的なプロキシをWaitHandle別のアプリケーション ドメインでします。

場合millisecondsTimeoutが 0 の場合、メソッドをブロックしません。 待機ハンドルの状態をテストし、直ちに返されます。

AbandonedMutexException.NET Framework version 2.0 の新機能です。 以前のバージョンで、WaitOneメソッドを返します。trueミュー テックスが破棄されます。 放棄されたミュー テックスは、多くの場合、重大なコーディング エラーを示します。 システム全体のミュー テックス、可能性があります (たとえば、Windows タスク マネージャーを使用) して、アプリケーションが突然終了されたことを示します。 例外には、デバッグに役立つ情報が含まれています。

このメソッドはブロック、現在のインスタンス シグナルを受け取るか、タイムアウトまでの呼び出し元が発生します。 このメソッドのブロックを使用して、WaitHandle別のスレッドからがシグナルを受け取る、非同期操作が完了したときに、生成されるなどです。 詳細については、IAsyncResult インターフェイスのトピックを参照してください。

派生クラスの動作をカスタマイズするには、このメソッドをオーバーライドします。

exitContextパラメーター影響を及ぼしませんしない限り、WaitOneメソッドが既定以外のマネージ コンテキスト内から呼び出されます。 派生したクラスのインスタンスへの呼び出し内部に、スレッドがある場合に発生ContextBoundObjectです。 派生していないクラスのメソッドを実行されている場合でもContextBoundObjectと同様、 String、既定以外のコンテキストであることができる場合、ContextBoundObjectが現在のアプリケーション ドメインで、スタック上にします。

既定以外のコンテキストで、コードの実行時に指定するtrueexitContext既定以外のマネージ コンテキストを終了するスレッド (つまり、既定のコンテキストに遷移する) 実行する前に、WaitOneメソッドです。 スレッドが呼び出しの後に元の既定以外のコンテキストに戻る、WaitOneメソッドが完了しました。

これを利用する場合、コンテキスト バインド クラスSynchronizationAttributeです。 その場合は、クラスのメンバーに対するすべての呼び出しが自動的に同期され、同期ドメインは、クラスのコードの本文全体です。 メンバーの呼び出し履歴内のコードを呼び出すかどうか、WaitOneメソッドを指定してtrueexitContextスレッドが続行する、オブジェクトの任意のメンバーへの呼び出しでブロックされているスレッドの同期ドメインを終了します。 ときに、WaitOneメソッドが戻る同期ドメインを再入力する呼び出しを行ったスレッドが待機する必要があります。

例を次にどのようにWaitOne(Int32, Boolean)メソッドのオーバー ロードは、同期ドメイン内で呼び出された場合に動作します。 最初に、スレッドが待機するexitContext'éý'falseし、待機のタイムアウト時間が経過するまでブロックします。 最初のスレッドが終了しで待機した後、2 番目のスレッドが実行されるexitContext'éý'trueです。 この 2 番目のスレッドの待機ハンドルの通知への呼び出しがブロックされていないと、印刷待ちタイムアウトする前に、スレッドが完了するとします。

using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;

[Synchronization(true)]
public class SyncingClass : ContextBoundObject
{
    private EventWaitHandle waitHandle;

    public SyncingClass()
    {
         waitHandle =
            new EventWaitHandle(false, EventResetMode.ManualReset);
    }

    public void Signal()
    {
        Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode());
        waitHandle.Set();
    }

    public void DoWait(bool leaveContext)
    {
        bool signalled;

        waitHandle.Reset();
        Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode());
        signalled = waitHandle.WaitOne(3000, leaveContext);
        if (signalled)
        {
            Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode());
        }
        else
        {
            Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode());
        }
    }
}

public class TestSyncDomainWait
{
    public static void Main()
    {
        SyncingClass syncClass = new SyncingClass();

        Thread runWaiter;

        Console.WriteLine("\nWait and signal INSIDE synchronization domain:\n");
        runWaiter = new Thread(RunWaitKeepContext);
        runWaiter.Start(syncClass);
        Thread.Sleep(1000);
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
        // This call to Signal will block until the timeout in DoWait expires.
        syncClass.Signal();
        runWaiter.Join();

        Console.WriteLine("\nWait and signal OUTSIDE synchronization domain:\n");
        runWaiter = new Thread(RunWaitLeaveContext);
        runWaiter.Start(syncClass);
        Thread.Sleep(1000);
        Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
        // This call to Signal is unblocked and will set the wait handle to
        // release the waiting thread.
        syncClass.Signal();
        runWaiter.Join();
    }

    public static void RunWaitKeepContext(object parm)
    {
        ((SyncingClass)parm).DoWait(false);
    }

    public static void RunWaitLeaveContext(object parm)
    {
        ((SyncingClass)parm).DoWait(true);
    }
}

// The output for the example program will be similar to the following:
//
// Wait and signal INSIDE synchronization domain:
//
// Thread[0004]: Waiting...
// Thread[0001]: Signal...
// Thread[0004]: Wait timeout!!!
// Thread[0001]: Signalling...
//
// Wait and signal OUTSIDE synchronization domain:
//
// Thread[0006]: Waiting...
// Thread[0001]: Signal...
// Thread[0001]: Signalling...
// Thread[0006]: Wait released!!!

.NET Framework
1.1 以降で使用可能
トップに戻る
表示: