如何通知解锁线程(Monitor.Wait(),PulseAll()模拟)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通知解锁线程(Monitor.Wait(),PulseAll()模拟)相关的知识,希望对你有一定的参考价值。

试图这样做,但得到SynchronizationLockException

static object blockObj = new object();
async void Method()
{
    await Task.Run(() =>
    {
        try
        {
            bool status = Monitor.TryEnter(blockObj);
            Debug.WriteLine("Block status: " + (!status).ToString());
            if (!status)
            {
                Monitor.Wait(blockObj, 7000);//got SynchronizationLockException
                Debug.WriteLine("Other did the job");
                return;
            }
            else
            {
                //Imitation of activity
                Thread.Sleep(3000);
                Monitor.PulseAll(blockObj);
                Debug.WriteLine("Completed");
            }
        }
        finally
        {
            if (Monitor.IsEntered(blockObj))
                Monitor.Exit(blockObj);
        }
    });
}

有没有办法告知代码执行的完成情况?

答案

我没有找到使用Monitor通知解锁线程的方法。试图使用Thread.Join()走另一条路。这是我想出的:

public static void Synchronize()
{
    if (th1 == null || !th1.ThreadState.In(System.Threading.ThreadState.Running, System.Threading.ThreadState.WaitSleepJoin))
    {
        Debug.WriteLine("Starting new thread...");
        th1 = new Thread(new ThreadStart(thr_sync));
        th1.Start();
    }
    else
        Debug.WriteLine("Thread is already started. Waiting for the end...");

    if (th1.Join(10000))
        Debug.WriteLine("Done");
    else
        Debug.WriteLine("Time out");
}
static void thr_sync()
{
    //Imitation of activity
    Thread.Sleep(3000);
}

以上是关于如何通知解锁线程(Monitor.Wait(),PulseAll()模拟)的主要内容,如果未能解决你的问题,请参考以下文章

c# Monitor.wait() 经典实例

Monitor.Wait,条件变量

不了解 Monitor.Pulse() 的必要性

为啥 Monitor.Wait() 和 Monitor.Pulse() 需要锁?

通知条件变量并解锁关联互斥锁后的“数据竞争”(不是真的)

Monitor.Wait 是不是确保重新读取字段?