5

以下のコードでは、Main関数は手動リセットイベント(mre)が設定されるのを待ちます。ただし、待機が開始される前に、同期オブジェクトは他のスレッドによってすでにシグナル状態に設定されています。

それで、「すでにシグナリングされた同期オブジェクト」を待つのは安全ですか?

class Program
{
    static void Main(string[] args)
    {
        ManualResetEvent mre = new ManualResetEvent(false);
        ThreadPool.QueueUserWorkItem(new WaitCallback(Func), mre);
        Thread.Sleep(1500);
        mre.WaitOne(100000); // Waiting for already signaled object
        Console.WriteLine("Wait Completed");
    }

    public static void Func(object state)
    {
        ManualResetEvent mre = (ManualResetEvent)state;
        mre.Set();
        Console.WriteLine("Mre Is Set");
    }
}
4

2 に答える 2

6

はい。すでに通知されている場合は、待機は行われません。それはいいです。

実際、の戻り値を見ると、すでに設定されている(またはタイムアウト前に設定されている)場合と、タイムアウト値内に設定されていない場合WaitOne(int)に返されることがわかります。truefalse

その区別が重要な場合があるため、戻り値があることに注意してください。

于 2012-06-13T10:48:56.900 に答える
0

はい、そうです、コードはそのまま続きます。

于 2012-06-13T10:48:57.610 に答える