C#:带'的异步方法;锁';指示

C#:带'的异步方法;锁';指示,c#,asynchronous,thread-safety,locking,C#,Asynchronous,Thread Safety,Locking,这个问题是关于线程安全和异步编程的。我想知道我的最终解决方案是否可行 我有一个线程安全类,如下所示: public class SafeLogger { public static SafeLogger Instance = new SafeLogger(); private object lock; private UnsafeLogger logger; private SafeLogger() { logger = new Unsa

这个问题是关于线程安全和异步编程的。我想知道我的最终解决方案是否可行

我有一个线程安全类,如下所示:

public class SafeLogger
{
    public static SafeLogger Instance = new SafeLogger();

    private object lock;
    private UnsafeLogger logger;

   private SafeLogger() 
   { 
       logger = new UnsafeLogger();
   }

   public void Log(string s)
   {
       lock (lock)
       {
          logger.Log(s);
       }
   }  

}  
如果向类中添加异步方法:

   public async void LogAsync(string s)
   {
       await Task.Run(() => Log(s));
   }

我的代码正确吗?

如果您所说的线程安全是指只有一个线程能够执行

logger.Log(s);
在任何时候,这都是线程安全的


lock语句确保了这一点,而不管Log方法是否被异步调用

如果您所说的线程安全是指只有一个线程能够执行

logger.Log(s);
在任何时候,这都是线程安全的


lock语句确保了这一点,而不管Log方法是否被异步调用

代码评审问题更多的是关于代码评审SE的主题。看起来代码审查基本上就是您所要求的,对吗?。如果没有更多的上下文,就不可能证实您的类是线程安全的。你说的“线程安全”是什么意思?你想达到什么具体标准?除此之外,您发布的代码似乎没有任何明显的错误(除了
async void
方法),但是也没有太多代码。甚至不足以知道为什么在一个不做其他事情的方法中使用
await
。另请参见变量“lock”总是空的。您需要“private object lock=new object();”代码评审问题更多的是关于代码评审SE的主题。看起来代码审查基本上就是您所要求的,对吗?。如果没有更多的上下文,就不可能证实您的类是线程安全的。你说的“线程安全”是什么意思?你想达到什么具体标准?除此之外,您发布的代码似乎没有任何明显的错误(除了
async void
方法),但是也没有太多代码。甚至不足以知道为什么在一个不做其他事情的方法中使用
await
。另请参见变量“lock”总是空的。您需要“private object lock=new object();”然而,正如sevzas上面提到的,你需要实例化你的锁对象。然而,正如sevzas上面提到的,你需要实例化你的锁对象。