У меня есть следующий шаблон Singleton для ViewModel моих опций:
private static volatile GeneralOptionsViewModel instance;
private static object syncRoot = new object();
/// <summary>
/// threadsave singleton
/// </summary>
public static GeneralOptionsViewModel Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new GeneralOptionsViewModel();
}
}
return instance;
}
}
В моем XAML у меня есть палитра цветов из расширенного пакета инструментов:
<xctk:PropertyGridEditorColorPicker Background="Transparent" Name="face"
Margin="5,0" Width="50" BorderBrush="#32FFFFFF" BorderThickness="1"
SelectedColor="{Binding FaceRectColor, Mode=OneWayToSource,
UpdateSourceTrigger=PropertyChanged}"/>
Как вы можете видеть, оно связано со FaceRectColor
свойством класса GeneralOptionsViewModel, которое определено следующим образом.
В сеттере происходит преобразование в MCvScalar (также свойство того же класса), формат, который мне позже понадобится для моего приложения:
public Color FaceRectColor
{
get
{
return faceRectColor;
}
set
{
if (faceRectColor != value)
{
faceRectColor = value;
FaceRectColorScalar = new MCvScalar(value.B, value.R, value.G, value.A);
SetProperty(ref faceRectColor, value);
}
}
}
Моя проблема сейчас заключается в том, что привязка работает, и правильные значения записываются в переменную, однако, когда я вызываю синглтон со свойством из другого класса - и из другого потока - он всегда показывает ноль для всех цветов каналы. Однако, если я нарушу программу непосредственно в классе синглтона, я смогу увидеть правильные значения. AFAIK, синглтон должен быть потокобезопасным, поэтому я ищу причину такого поведения.
Я предполагаю, что есть проблема с многопоточностью, так как другие свойства класса singleton отображаются правильно, но они вызываются только в основном потоке.
Edit: в моем случае все значения свойств класса singleton устанавливаются до того, как рабочий поток активен. Это означает, что никаких изменений в течение рабочего потока не происходит.
Редактировать II: Вот полный проект для оценки кода.
В классе CameraViewModel в строке 202 находится соответствующий вызов функции, где я хочу передать значения из синглтона.