2017-04-11 2 views
0

この質問は、スレッドの安全性と非同期プログラミングに関するものです。私は私の最終的な解決が大丈夫かどうかを知りたい。C#: 'lock'命令による非同期メソッド

私はこのようになりますスレッドセーフなクラスがあります:私は私のクラスに非同期メソッドを追加する場合

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)); 
    } 

は正しい私のコードですか?

+1

コードレビューの質問は、コードレビューSEのトピックに関するものです。コードレビューは基本的にあなたが求めているようですが、それは正しいのですか? – BradleyDotNET

+0

[「スレッドセーフとは何ですか?」](https://blogs.msdn.microsoft.com/ericlippert/2009/10/19/what-is-this-thing-you-call-thread-あなたのクラスがスレッドセーフであるというあなたの主張を、文脈がなくても確認することは不可能です。 (async voidメソッド以外の)あなたが投稿したコードには明らかに間違っているようですが、あまりコードはありません。 –

+0

も参照してください[このように「スレッドセーフ」とは何ですか?](http://www.grumpydev.com/2010/02/26/so-what-is-this-thread-safe-thing -anyway /) –

答えて

2

スレッドセーフで一つだけのスレッドが一度に

logger.Log(s); 

を実行することができるようにすることを意味している場合、はい、これはスレッドセーフです。

lockステートメントは、Logメソッドが非同期に呼び出されたかどうかにかかわらず、これを保証します。

+0

上記のsevzasで述べたように、あなたのロックオブジェクトをインスタンス化する必要があります。 – Chris

関連する問題