2009-12-23 9 views
3

나는 동시성에 대해 읽고 있었고,보다 "스레드 안전성"관점에서 사물을보고 있었다. WPF (또는 실제로 System.Windows.Freezable 및 기타)에는 "아이스크림 불변성"을 줄 수있는 freezable 클래스가 있습니다. WPF/Silverlight 외부에서이 기능을 사용하려 한 사람이 있었습니까?이 기능을 사용하거나 다른 사람의 것을 사용하는 것이 더 낫습니까? 밖에 좋은 것들이 몇 개 있다는 것을 압니다.WPF 외부에서 Freezable 클래스를 사용하는 "Gotchas"가 있습니까?

답변

3

WPF 외부의 System.Windows에서 Freezable 형식을 사용하면 안됩니다.

이유는 WindowBase.dll (또는 Freezable이 정의 된 위치)에 대한 종속성을 만드는 것입니다. 그리고 이러한 참조는 UI에 직접 액세스하지 않고 "모델 프로젝트"에 존재해서는 안됩니다.

그러나 자신 만의 Freezable 기본 클래스를 쉽게 코딩 할 수 있습니다.

public interface IFreezable 
{ 
    bool CanFreeze 
    { 
     get; 
    } 
    bool IsFrozen 
    { 
     get; 
    } 

    void Freeze(); 
} 

참고 CanFreeze 속성 :

나는 (그것을 순환 참조했다) 나는 복잡한 개시를 요구 스레드 안전 객체를 만들고 싶었 응용 프로그램에서 다음과 같은 인터페이스를 사용 나는로 사용하기로 결정 얼어 붙기 전에 Freezables의 유효성을 검사하고 싶었습니다. 클라이언트에게 그렇게 할 기회를주지 않으면 제 생각에는 좋지 않습니다.

Freezables의 개념은 IMO는 멀티 스레드 응용 프로그램에서 도구 팔레트를 풍성하게하는 좋은 아이디어입니다.

1

Freezable 및 다른 Dispatcher/Dependent 개체를 자유롭게 사용할 수 있습니다. WindowsBase.dll을 참조하는 것은 헤드리스 서버 프로그램에 GDI32.DLL을로드하는 것과 다를 바 없습니다. 고려해야 할 유일한 점은 DispatcherObject가 Windows 메시지 루프를 중심으로 지향되어 있으며 코드가 이벤트 중심적이고 개체가 Dispatcher 이벤트 루프가있는 스레드에 상주하지 않으면 최소한의 이점이 될 인프라를 제공한다는 것입니다. 그렇다면 DispatcherObject 파생물 내에서 스레드 선호도로 원시 객체를 래핑함으로써 상당한 설계의 명확성과 유연성을 얻을 수 있습니다 (필자는 ESENT로 큰 효과를 얻었습니다). 그것은 단지 당신이 생각하고 싶어하는 상자 바깥의 얼마나 멀리 떨어져 있느냐에 달려 있습니다.