ApplicationException 생성자는 인스턴스 멤버이므로 스레드로부터 안전하지 않을 수 있습니다. 다음 코드가 완전히 불필요한 지 어떻게 알 수 있습니까? 내가 "알다"라고 말하면, 문서에 불필요하거나 .NET 소스 코드를 보았으므로 불필요하다는 것을 알리는 문서가 있습니다..NET 스레드 안전
// thread-safe
internal static class TsApplicationException
{
private readonly static object myLock = new object();
internal static void Throw(string msg, Exception e)
{
lock (myLock)
{
throw new ApplicationException(msg, e);
}
// the implementation of lock() ensures that the unlock will happen
// even if there is an exception thrown
}
}
편집 : 문서가 명시 적으로이 필요할 수 있습니다 제안하기 때문에이 문제는 근거없는 우려가 없습니다. 이 문제는 다소 퍼지는 문서 버그로 인해 발생할 수 있습니다.
편집 : 아래 코드는 내 스레드 이외에 직접적으로 책임이있는 코드와 내가 본 적이없는 코드를 제안했지만 아아아 나는 .NET의 클라이언트로 간접적으로 책임이 있습니다. Windows - 브라우저, 오피스, 뮤직 플레이어 등 내 컴퓨터에서 실행되는 스레드가 여러 개 있지만 제대로 작동하는 것 같습니다. 나는 이상적으로 내가보기에 다른 증거와 다른 것을 찾고 있다고 생각한다. 아마도 내 음악 플레이어를 쓴 사람들도이 방법으로 잠금을 설정하고 있습니다.)이 경우에는 전혀 증명할 수 없습니다.
이 문제에는 두 가지 변형이있을 수도 있습니다. 하나는 단일 응용 프로그램의 스레드 (.NET 및 Windows 스레드로 진행되는 작업)가 소리가 나는 문제이고 다른 하나는 모든 응용 프로그램의 스레드가 소리가 나는 것입니다 (서로 공존 함). .NET 및 Windows). 제 질문은 첫 번째 경우에 적용됩니다. Windows가 응용 프로그램을 격리 상태로 유지하는 방법에 대한 가정을하지 않으며이 질문을 게시하는 것과 관련하여 내 관심사가 아닙니다.
마지막으로,이 잠금이 필요한 경우 .NET Framework 및 타사 개체 사용을 위해 다른 많은 잠금이 필요합니다. 예 : MySQL 문서는 "thread-safe"가 보장되지 않은 인스턴스 메소드에 대해서도 같은 행을 가지고 있습니다. 여러 .NET 사례 및 대부분의 MySQL 사례에서 위험은 단순히 예외를 throw하는 것보다 훨씬 더 많은 기능을 포함합니다.
ApplicationException 개체의 속성은 다른 스레드에서 변경하지 않지만 .NET 속성과 Windows 속성은 어떻게됩니까? – H2ONaCl
".NET 속성 및 Windows 속성"이란 무엇입니까? 예외가 생성되면 핸들러에 도달 할 때까지 던져진 스레드의 스택을 넘기고 (또는 궁극적으로는 사용자에게 오류를 표시하는 핸들러 - 오브 - 그 전에 처리하지 못했습니다). 그 스레드에만 관련이없는 것은 아무 일도 일어나지 않습니다 (EventLog에 도달하면 로깅이 발생하지만 EventLog의 문제는 스레드로 처리되고 처리 할 수 있습니다). –
".NET 및 Windows 속성"이란 런타임 프레임 워크 및 운영 체제의 변수를 의미합니다. – H2ONaCl