Как получить свойство зависимости silverlight, когда нет в потоке пользовательского интерфейса? - PullRequest
0 голосов
/ 13 июля 2009

У меня, по сути, та же проблема, что обсуждалась здесь: http://khason.net/blog/dependency-property-getters-and-setters-in-multithreaded-environment/

public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(bool),
        typeof(MyObject), new PropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged)));

public static bool GetMyProperty(DependencyObject obj)
{
    return (bool)obj.GetValue(MyPropertyProperty);     <<<<<
}

public static void SetMyProperty(DependencyObject obj, bool value)
{
    obj.SetValue(MyPropertyProperty, value);
}

Если строка с пометкой «<<<<<» вызывается из фонового потока, Silverlight генерирует исключение InvalidOperationException, и мое приложение, вероятно, блокируется. </p>

К сожалению, решение из поста в блоге не будет работать, поскольку версия класса Dispatcher в Silverlight скрывает синхронизированные методы Invoke - только BeginInvoke помечается как общедоступный.

Ответы [ 2 ]

5 голосов
/ 13 июля 2009

В главном потоке перед созданием фонового потока сохраните значение SynchronizationContext.Current в переменной с именем context, доступной для порожденного потока. Затем попробуйте следующий код,

bool result = false;
context.Send((c) => result = YourClass.GetMyProperty(obj), null);

Возможно, вы захотите переписать статический метод, чтобы проверить, находится ли он в правильном потоке, и, если нет, использовать значение SynchronizationContext.Current, для которого спрятаны значения, чтобы временно переключиться на правильный поток для получения значения.

0 голосов
/ 13 июля 2009

Вы можете использовать BeginInvoke в сочетании с событием ручного сброса, которое срабатывает при обратном вызове.

...