На данный вопрос уже ответили:
Если урезать код и избежать модели MVVM, то вот что пытаюсь сделать:
public MainWindow(MainViewModel mainViewModel)
{
this.InitializeComponent();
// ...
Thread bgThread = new Thread(new ThreadStart(DoSomeUIActions));
bgThread .Start();
}
private void DoSomeUIActions()
{
Queue<KeyValuePair<string, string>> somePairs = new Queue<KeyValuePair<string, string>>();
// инициализация очереди
try
{
while (true)
{
KeyValuePair<string, string> tmp = somePairs.Peek();
BitmapImage img = new BitmapImage();
img.BeginInit();
img.UriSource = new Uri(tmp.Value);
img.EndInit();
Application.Current.Dispatcher.Invoke(new Action(() => {
if (img.CanFreeze)
{
img.Freeze();
}
this.someImageOnWindow.Source = img;
}), DispatcherPriority.ContextIdle);
this.myWindowInnerProperty= tmp.Key;
somePairs.Enqueue(tmp);
Thread.Sleep(10000);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
В итоге вылетает исключение The calling thread cannot access this object because a different thread owns it
. Не могу понять в чём проблема и как её решить. Поможете?
Попробуйте так использовать Dispatcher: создавать картинку в основном потоке.
App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
BitmapImage img = new BitmapImage();
img.BeginInit();
img.UriSource = new Uri(tmp.Value);
img.EndInit();
if (img.CanFreeze)
{
img.Freeze();
}
this.someImageOnWindow.Source = img;
myWindowInnerProperty= tmp.Key;
}));
Виртуальный выделенный сервер (VDS) становится отличным выбором
Помогите упростить кодНаверно, это можно сделать через LINQ или как-то ещё
Мое приложение авторизовываться с помощью одного метода Authorize в сервисе wcfАргумент ы метода - логин, пароль, параметры машины пользователя...
У меня есть 2 таблицы, хочу добавить по строке в каждую и передать изменения в БДПользуюсь при этом SqlCommandBuilder