Skip to main content
 首页 » 编程设计

c#之一次将代码部分锁定到一个入口

2024年02月02日31dudu

我试图限制对单例对象的访问,所以只有一个线程 及时使用它,此外,我想防止同一个线程访问两次 到受限代码。

我尝试了 Lock 方法,我发现它不会锁定锁定她的线程,但只会锁定其他线程..

如下:

public sealed class Singleton 
{ 
    private static readonly Singleton instance    = new Singleton(); 
 
    static Singleton() 
    { 
    } 
 
    private Singleton() 
    { 
    } 
 
    public static Singleton Instance 
    {  
        get 
        { 
            return instance; 
        } 
    } 
} 
 
public class SomeWorker 
{ 
    private readonly Timer _doWorkTimer = new Timer(20); 
 
    public SomeWorker() 
    { 
        InitiateTimer(); 
    } 
 
    private void InitiateTimer() 
    {  
        _doWorkTimer .Elapsed += DoWorkElapse; 
        _doWorkTimer .Enabled = true; 
    } 
 
    private void DoWorkElapse(object source, ElapsedEventArgs e) 
    {  
        DoSomeWork(); 
    } 
 
    private void DoSomeWork() 
    { 
        // I know that lock on string is wrong! 
        // Its just for the example only I 
        // Its just to make sure all the program is use the same lock.. 
        lock ("ConnectionLock") 
        {  
             Console.WriteLine("Lock"); 
 
             var inst = Singletone.Instance; 
 
             // Do Some Work on "inst" ... 
 
             Console.WriteLine("Unlock"); 
        } 
    } 
} 

例如控制台中的结果是:

. . .

锁定

解锁

锁定

锁定

解锁

. . .

可以看到,2个Lock评论一个接一个显示

所以这意味着“DoSomeWork()”被计时器线程访问了两次。

有人知道如何让这个锁起作用吗?

可能还有其他同步方法?

谢谢。

请您参考如下方法:

您没有正确进行锁定(最重要的是,您锁定了一个字符串,这是一个很大的禁忌)。为了节省时间,请阅读this Jon Skeet 的文章并实现其中一种模式来避免头痛。