2017-04-11 9 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)); 
    } 

내 코드가 정확

나는 다음과 같습니다 스레드 안전 클래스가? 스레드에 의해 당신은 하나 개의 스레드가 한 번에

logger.Log(s); 

을 실행할 수 있습니다 의미하는 경우

+1

코드 검토 질문은 코드 검토 SE에서 더 많은 주제를 다룹니다. 그것은 코드 리뷰처럼 기본적으로 당신이 요구하는 것 같습니다, 맞습니까? – BradleyDotNET

+0

[ "스레드 안전이라고하는 것은 무엇입니까?]] (https://blogs.msdn.microsoft.com/ericlippert/2009/10/19/what-is-this-thing-you-call-thread- 안전한 /). 당신의 클래스가 문맥없이 스레드로부터 안전하다는 주장을 확인하는 것은 불가능합니다. "스레드 안전"이란 무엇을 의미합니까? 당신은 어떤 구체적인 기준을 충족하려고합니까? (async void method가 아닌) 게시 한 코드에 분명히 틀린 점이있는 것 같지만 거기에는 코드가별로 없습니다. 왜 당신이 어떻게 await를 사용 하는지를 알기에는 충분하지 않습니다. –

+0

참고 [이게 뭐니 뭐니해도 "스레드 세이프 (Thread Safe)"[어쨌든?] (http://www.grumpydev.com/2010/02/26/so-what-is-this-thread-safe-thing) -anyway /) –

답변

2

은 다음 네이 스레드입니다.

lock 문은 Log 메서드가 비동기로 호출되는지 여부에 관계없이이를 보장합니다.

+0

그러나 sevzas에서 위에서 언급했듯이 잠금 개체를 인스턴스화해야합니다. – Chris