2

На строке:

node.name_ = textBlockHead.Text;

Необработанное исключение типа "System.InvalidOperationException" в WindowsBase.dll

Дополнительные сведения: Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.

TimerCallback timeCB = new TimerCallback(TimerForNodeSave);

            Timer time = new Timer(timeCB, null, 0, 10000);

void TimerForNodeSave(object state)
        {
            NodeSave(null, null);
        }

void NodeSave(object sender, RoutedEventArgs e)
        {
...
SaveTextTo(GLOBAL.node_old);

void SaveTextTo(Node node)
        {
            node.name_ = textBlockHead.Text;
code211218
  • 3,953

1 Answers1

4

Вы должны обращаться к UI-элементам только из главного потока. Судя по всему, textBlockHead у вас UI-элемент. Чтобы прочитать значение из него, делайте как-то так:

void SaveTextTo(Node node)
{
    string text = null;
    Dispatcher.Invoke(() => text = textBlockHead.Text);
    node.name_ = text;
}

Но правильнее было бы воспользоваться async/await и радикально упростить код:

async Task RunPeriodicSave()
{
    while (true)
    {
        await Task.Delay(10000);
        var text = textBlockHead.Text
        SaveTextTo(GLOBAL.node_old, text);
    }
}

А если SaveTextTo медленный, то

        await Task.Run(() => SaveTextTo(GLOBAL.node_old, text));
Rakzin Roman
  • 5,720
VladD
  • 206,799
  • Вроде где-то был каноничный вопрос на эту тему? Можно было закрыть как копию. – andreycha Nov 30 '16 at 20:08
  • @andreycha: Ага, я беглым поиском не нашёл. Но вообще дубликат, конечно. – VladD Nov 30 '16 at 20:10
  • @andreycha: Вот есть, но он не очень каноничный: http://ru.stackoverflow.com/q/106006/10105 – VladD Nov 30 '16 at 20:11
  • 1
    @andreycha: О, нашёл: http://ru.stackoverflow.com/q/418461/10105 – VladD Nov 30 '16 at 20:12
  • Да, именно. Надо бы подобные вопросы себе в закладки добавлять, чтоб под рукой были ). – andreycha Nov 30 '16 at 20:13
  • @andreycha: Хорошая идея :) – VladD Nov 30 '16 at 20:13