powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Многопоточность
3 сообщений из 3, страница 1 из 1
Многопоточность
    #38701895
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему падает код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Task.Factory.StartNew(() => _model.GetItems(node).Select(n => n))
.ContinueWith(t =>
{
    if (t.Result != null)
    {
        ObservableCollection<ItemValue> children = new ObservableCollection<ItemValue>(t.Result);                                
        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.
Task.Factory.StartNew(() => _model.GetItems(node).Select(n => n))
.ContinueWith(t =>
{
    if (t.Result != null)
    {
        ObservableCollection<ItemValue> children = _model.GetItems(node);                                
        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
Многопоточность
    #38702080
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем я решил проблему:
Код: 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
Многопоточность
    #38712544
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_ПавПочему падает код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Task.Factory.StartNew(() => _model.GetItems(node).Select(n => n))
.ContinueWith(t =>
{
    if (t.Result != null)
    {
        ObservableCollection<ItemValue> children = new ObservableCollection<ItemValue>(t.Result);                                
        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.
Task.Factory.StartNew(() => _model.GetItems(node).Select(n => n))
.ContinueWith(t =>
{
    if (t.Result != null)
    {
        ObservableCollection<ItemValue> children = _model.GetItems(node);                                
        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.
Не пойму, почему заполнение коллекции в другом потоке как-то влияет на гуи.
надо повнимательнее посмотреть конструктр Тасков и Continue,
автор TaskScheduler.FromCurrentSynchronizationContext( должно отработать в UI потоке.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Многопоточность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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