我想要

Monitor.Enter(this.StaticLock);
try
{
    // Do something ...

    ThreadPool.QueueUserWorkItem(state =>
    {
        try
        {
             // Do something else...

        }
        finally
        {
            Monitor.Exit(this.StaticLock);
        }
    });
}
catch (Exception)
{
    Monitor.Exit(this.StaticLock);
    throw;
}

但这是行不通的,因为它不能在当前线程中不是Monitor.Exit的对象上使用Monitor.Enter。怎么做?我应该使用线程间通讯吗?

最佳答案

Semaphore允许您将它们锁定在一个线程中,而将其解锁在另一个线程中。

但是这种行为对我来说非常可疑...您到底想实现什么?在实践中,几乎绝不应这样做。

static readonly Semaphore semaphore = new Semaphore(1, 1);

void Method1()
{
    semaphore.WaitOne();
    try
    {
        // Do something ...

        new Thread(() =>
        {
            try
            {
                // Do something else...

            }
            finally
            {
                semaphore.Release();
            }
        }).Start();
    }
    catch (Exception)
    {
        semaphore.Release();
        throw;
    }
}

关于c# - 如何在线程之间转移锁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9201848/

10-10 13:45