소개C#을
내가 작업자 스레드에서 호출 할 추상적 인 방법으로, 공개 추상 클래스가 있습니다.
이 메서드를 호출하면 계산 중 상태가 변경되지 않도록 각 인스턴스를 잠글 수 있습니다.
상속인의 구현이 제 3 자에 의해 수행되기 때문에 나는 오직 추상 클래스로 작업하기를 원합니다.
public abstract class MyClass
{
public abstract MyResult GetData();
}
내 라이브러리가 타사에서 사용하는 문제는, 나는 그들이 도서관의 내부 구현에 대해 아무것도 알고 있다고 가정합니다.
나는이 나쁜 형식을 고려할 때 자신의 상속자를 구현할 수 있기 전에 내 수업의 문서를 연구하도록 강요하고 싶지 않습니다.
내 접근
내 첫번째 생각은 클래스에 보호 잠금 개체를 추가하고 메서드를 호출 할 때 그것을 잠글 수 있었다.
그러나이 기능을 유용하게 사용하려면 제 3자가이를 고정시켜야합니다.
제 3 자에게 내부 정보를 알리고 싶지 않기 때문에이 옵션이 마음에 들지 않습니다.
public abstract class MyClass
{
protected readonly object myLock = new object();
public MyResult GetData()
{
MyResult result;
lock(myLock)
{
result = GetDataInternal();
}
return result;
}
protected abstract MyResult GetDataInternal();
}
배경
내가 별도의 스레드에서 실행되는 데이터 파이프 라인에서 일하고 있어요.
이 파이프 라인은 데이터를 특정 형식으로 요청하고 백그라운드에서 처리합니다.
데이터를 제공하는 데 시간이 오래 걸릴 수 있으며 제공된 데이터는 개체의 속성에 의존합니다.
이 경우 3D 모델 용 준비 파이프 라인입니다.
질문 나는 그것의 구현을 모른 채 전체 개체를 잠글 수있는 방법
?
그런 방법이 없다면 합의 된 패턴이 있습니까?
그냥 의견. 유형을 상속받은 사람들이 문서를 읽고 명시한 규칙을 따르도록하는 것은 나쁜 형식이 아니므로 ** 절대적으로 필요합니다 **. 그들이 성공의 구덩이에 쉽게 빠져들도록해야하지만, 당신이 당신의 타입으로부터 상속 받도록하려는 경우에는 절대 안전한 타입을 만들 수 없습니다. 아는 사람들은 예상했던 것보다 부정적인 것을 반환하는 메소드를 구현할 수 있습니다.이 스 패인 턴트 유형을 사용하는 코드의 작업에 큰 스패너를 던지십시오. –
"코드를 잠그는"일반화 된 잠금이 없으며 해당 코드없이 잠금이 실행됩니다. 즉, 일부 코드가 잠금없이 객체에 액세스하고 일부 코드가 함께 사용되면 잠금을 변경하지 않고 마술처럼 첫 번째 코드를 신경 쓸 수 없습니다. 개체의 스냅 샷 만 제공하는 등의 스레드 안전 액세스를 제공하기 위해 개체를 닫을 수 있지만이 경우에도 해당 유형을 사용하는 타사 코드를 변경해야합니다. –
맞습니다. 문서를 읽는 것이 필수입니다. 그러나 여기에서는 대부분의 사람들이 myLock 속성을 인식하지 못하는 직관적 인 요구 사항을 싫어합니다. 나는 (대부분의 경우) 문서가 읽힐 때만 제대로 사용되는 구현을 싫어한다. – Chillersanim