2017-04-11 80 views
0

這個問題是關於線程安全和異步編程。我想知道我的最終解決方案是否正確。C#:異步法「鎖定」指令

我有一個線程安全的類,它看起來是這樣的:

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-安全/),這是不可能的,以確認你的要求,你的類是線程安全的,沒有更多的內容。它是什麼,_you_通過「線程安全」?什麼具體的標準是你想見面嗎?除此之外,還有沒有按平均你發佈的代碼似乎沒有什麼明顯的錯誤(除了'async void'方法),但是那裏的代碼也不是很多,甚至沒有足夠的知道你爲什麼要用一個方法中的await沒有別的。 –

+0

參見[那麼,什麼是這個「線程安全」的事反正?](http://www.grumpydev.com/2010/02/26/so-what-is-this-thread-safe-thing (不管怎麼說)/) –

回答

2

如果線程你的意思只有一個線程可以在任何時間執行

logger.Log(s); 

,那麼是的,這是線程安全的。無論登錄方法是否aynchronously或不叫

lock語句來確保這一點。

+0

但正如上面提到的sevzas,你將需要實例化你的鎖對象。 – Chris