Есть ли "Gotchas" с использованием класса Freezable вне WPF? - PullRequest
3 голосов
/ 23 декабря 2009

Я читал о параллелизме и смотрю на вещи с более «поточно-безопасной» точки зрения. WPF (или фактически System.Windows.Freezable и другие) имеет класс freezable, который может дать «неизменность эскимо». Кто-нибудь пробовал использовать это за пределами WPF / Silverlight, и было бы лучше использовать это, или свернуть свое / использовать чужое? Я знаю, что там есть несколько хороших.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2009

Вы не должны использовать тип Freezable в System.Windows вне WPF.

Причиной этого является то, что вы создаете зависимость от WindowBase.dll (или там, где определяется Freezable). И такая ссылка не должна существовать в «модельных проектах» без прямого доступа к пользовательскому интерфейсу.

Однако вы можете легко написать свой собственный базовый класс Freezable.

Я использовал следующий интерфейс в приложении, где я хотел создать потокобезопасные объекты, которые требовали сложной инициализации (это были циклические ссылки):

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

    void Freeze();
}

Обратите внимание на свойство CanFreeze: я решил использовать его так, как я хотел проверить Freezables перед замораживанием - и, по моему мнению, отсутствие у клиента возможности сделать это нехорошо.

Концепция Freezables - это хорошая идея IMO, которая обогащает палитру инструментов в многопоточных приложениях.

1 голос
/ 15 сентября 2011

Не стесняйтесь использовать Freezable и другие диспетчерские / зависимые объекты везде, где вы чувствуете необходимость. Ссылка на WindowsBase.dll ничем не отличается от загрузки GDI32.DLL в безголовую серверную программу (как они все делают и должны). Единственное, что вам нужно учитывать, - это то, что DispatcherObject ориентирован на цикл сообщений Windows и предоставляет инфраструктуру, которая принесет вам минимальную пользу, если ваш код не управляется событиями, а ваши объекты не находятся в потоках с циклами событий Dispatcher. Но если это так, вы можете получить значительную ясность и гибкость проектирования, оборачивая собственные объекты с привязкой потоков к производным DispatcherObject (я сделал это с большим эффектом с ESENT). Все зависит только от того, насколько далеко вы готовы думать.

...