powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточность
6 сообщений из 6, страница 1 из 1
Многопоточность
    #38701742
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хоть и проблема возникла при работе с WPF, но думаю, что это всё же вопрос по фреймворку.
Почему падает код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
IEnumerable children = null;
Task.Factory.StartNew(() =>
{
    children = _model.GetItems(node);
})
.ContinueWith(t =>
{                            
    if (children != null)
    {
        int rowIndex = Rows.IndexOf(node);
        node.ChildrenSource = children as INotifyCollectionChanged;
        node.Children.Clear();
        Rows.RemoveAt(rowIndex + 1);
        foreach (object obj in children)
        {
            TreeNode child = new TreeNode(this, obj);
            child.HasChildren = HasChildren(child);
            node.Children.Add(child);
        }
        Rows.InsertRange(rowIndex + 1, node.Children.ToArray());
    }
}, TaskScheduler.FromCurrentSynchronizationContext());


и отрабатывает код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
IEnumerable children = null;
Task.Factory.StartNew(() =>
{
    
})
.ContinueWith(t =>
{  
    children = _model.GetItems(node);                          
    if (children != null)
    {
        int rowIndex = Rows.IndexOf(node);
        node.ChildrenSource = children as INotifyCollectionChanged;
        node.Children.Clear();
        Rows.RemoveAt(rowIndex + 1);
        foreach (object obj in children)
        {
            TreeNode child = new TreeNode(this, obj);
            child.HasChildren = HasChildren(child);
            node.Children.Add(child);
        }
        Rows.InsertRange(rowIndex + 1, node.Children.ToArray());
    }
}, TaskScheduler.FromCurrentSynchronizationContext());


В первом случает вылетает ошибка
Необходимо создать DependencySource в том же потоке, в котором создан DependencyObject.
Не пойму, почему заполнение коллекции в другом потоке как-то влияет на гуи.
...
Рейтинг: 0 / 0
Многопоточность
    #38701955
Badabum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ХЗ за WPF, но взаимодействие с гуи обычно должно быть с того-же самого потока в котором оно создавалось
...
Рейтинг: 0 / 0
Многопоточность
    #38701965
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BadabumХЗ за WPF, но взаимодействие с гуи обычно должно быть с того-же самого потока в котором оно создавалось
Так я с ГУИ и взаимодействую из того же потока TaskScheduler.FromCurrentSynchronizationContext() за это отвечает.
Я в отдельном потоке только коллекцию заполняю.
...
Рейтинг: 0 / 0
Многопоточность
    #38702032
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,

Может быть TaskScheduler.FromCurrentSynchronizationContext() влияет только на последнего делегата?
И в первом случае создание массива было выполнено "не там"?
...
Рейтинг: 0 / 0
Многопоточность
    #38702077
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129Супер_Пав,

Может быть TaskScheduler.FromCurrentSynchronizationContext() влияет только на последнего делегата?
И в первом случае создание массива было выполнено "не там"?
Вы сейчас написали моё сообщение, только другими словами :)
...
Рейтинг: 0 / 0
Многопоточность
    #38702078
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем я решил проблему:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ObservableCollection<ItemValue> children = new ObservableCollection<ItemValue>();
Task.Factory.StartNew(() =>
{
    Application.Current.Dispatcher.Invoke(()=> children = new ObservableCollection<ItemValue>(_model.GetItems(node)));                            
})
.ContinueWith(t =>
{
    if (children.Count > 0)
    {                                
        //Тут заполняю контрол
    }
}, TaskScheduler.FromCurrentSynchronizationContext());
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]