在WPF之外使用Freezable类的任何“问题”?

时间:2009-12-23 18:55:54

标签: c# immutability freezable

我一直在阅读并发性,并从更“线程安全”的角度来看待事物。 WPF(或实际上是System.Windows.Freezable和其他人)有一个freezable类,它可以赋予“冰棒不可变性”。有没有人尝试在WPF / Silverlight之外使用它,并且最好是使用它,还是自己滚动/使用别人的?我知道那里有一些好的。

2 个答案:

答案 0 :(得分: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 :(得分:1)

随时随地使用Freezable和其他调度程序/依赖项对象。引用WindowsBase.dll与将GDI32.DLL加载到无头服务器程序(因为它们都必须这样做)没什么不同。您需要考虑的唯一事情是DispatcherObject面向Windows消息循环,并提供对您没有什么好处的基础结构,除非您的代码是事件驱动的,并且您的对象驻留在具有Dispatcher事件循环的线程上。但是如果是这样的话,你可以通过在DispatcherObject衍生物中包装具有线程亲和性的本机对象来获得实质性的设计清晰度和灵活性(我已经通过ESENT实现了这一点)。这一切只取决于你愿意在框外多远思考。

相关问题