2015-01-27 2 views
0

Я создал свою собственную графическую библиотеку. Пока все работает отлично, за исключением того, что часть чертежа не является параллельной. Как я могу это достичь? Сейчас мой экран замерзает, добавляя элемент в элемент управления диаграммы. Я попытался переписать функцию добавления как Task.Run(()=> { adding to the ObservableCollection }), но безуспешно.Асинхронный UserControl

Это всего лишь метод в библиотеке async? Если да, то что я верну, поскольку мне нужен хотя бы один Task?

Есть ли другой способ создать асинхронный контроль, я имею в виду вообще? Мое желание состоит в том, чтобы иметь такой элемент управления, как ListView, где я могу добавлять элементы, а новые элементы добавляются параллельно списку.

+0

Вы используете wpf или winform? –

+1

Если основной 'listOfItems.Add (existingItem); Invalidate();' зависает ваш взгляд, количество асинхронных кодов не поможет ... (Также ваше определение «добавление элемента в диаграмму» может быть совсем другим, но я бы порекомендуйте его, если это так). –

+0

@ Эрик, это WinRT – Dani

ответ

1

Элементы управления пользовательского интерфейса являются нито-аффинными, их можно обрабатывать только из потока пользовательского интерфейса, поэтому вы видите Task.Run сбой.

Существует общее правило, согласно которому вы не должны занимать интерфейс с работой с ЦП более 50 мс. Если у вас есть большой объем данных для обработки с помощью элементов управления пользовательского интерфейса, попробуйте выполнить операцию в меньших рабочих группах и освободить поток пользовательского интерфейса между итерациями.

В целом, вы не должны раскрывать asynchronous wrappers over sync methods.

Позвольте пользователю явно разгрузить любую работу, которую он имеет, в фоновый поток.

+0

Спасибо, это означает, что все это вопрос времени? «Если у вас есть большой объем данных для обработки элементов управления пользовательским интерфейсом, попробуйте выполнить обработку в меньших рабочих группах и освободить поток пользовательского интерфейса между итерациями». Что это значит? Как я могу освободить пользовательский интерфейс? – Dani

+0

@ Dani - разделите большой список на подкатегории и, возможно, используйте 'await Task.Delay (50);' чтобы дать UI «дыхание», –

Смежные вопросы