Как я могу узнать, когда была вызвана последняя из серии событий? - PullRequest
0 голосов
/ 02 августа 2009

Я пишу плагин для программы, в которой у меня есть пользовательский элемент управления с TreeView . Когда пользователь выбирает или отменяет выбор объектов в собственной программе, ObjectSelected и ObjectDeselected вызывают события. Когда эти события будут запущены, моя программа выберет или отменит выбор соответствующих узлов в древовидном представлении.

Проблема в том, что это программа для трехмерного графического моделирования. Таким образом, пользователю очень просто нарисовать блок выбора среди тысячи маленьких объектов и разбить мой код тысячами ObjectSelected событий. Так что сейчас мой плагин работает, но если пользователь выбирает слишком много объектов, он должен ждать, пока мой плагин справится со всеми событиями ObjectSelected .

Вместо того, чтобы что-то делать в каждом событии выбора, я мог бы вместо этого кэшировать выбранные объекты в отдельную коллекцию, а затем обрабатывать список в массе, а не каждый объект по одному. Но как определить, когда вызывается последнее событие ObjectSelected ?

Я думаю, что мне нужно использовать несколько потоков, чтобы каждый выбранный объект события сбрасывал таймер. Когда таймер наконец получает шанс достичь своего конечного времени, он обрабатывает полный список выбранных объектов.

Хотя я никогда не делал ничего с несколькими потоками, поэтому я не знаю, с чего начать что-то подобное. Кроме того, мне не очень нравится идея, чтобы мой плагин зависел от определенного предельного времени. Что делать, если пользователь работает на более быстром / медленном компьютере? Или что, если один из объектов, которые они выбирают, действительно сложен, и по какой-то причине он занимает больше времени, чем другие объекты?

1 Ответ

0 голосов
/ 02 августа 2009

Несмотря на то, что вы сказали, что не хотите работать с несколькими потоками, это именно та ситуация для них (с пользовательским интерфейсом в отдельном потоке в качестве фоновых расчетов).

К счастью, C # делает базовые потоки действительно простыми. Взгляните на класс BackgroundWorker и некоторые примеры с ним.

Вы можете решить проблемы с быстрым выбором различных элементов, добавив возможность отмены BackgroundWorker и начните заново с новыми вычислениями.

...