Нужно ли беспокоиться о проблемах параллелизма в моем коде Flex / AIR? - PullRequest
4 голосов
/ 10 января 2009

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

Этот обработчик получает набор данных из ArrayCollection ожидающих запросов, назначает его объекту и удаляет набор данных из ArrayCollection.

(Я не могу открыть коллекцию ArrayCollection, потому что мне нужно перебрать ее, чтобы найти подходящий набор данных - он не всегда находится сверху).

Возможно ли, что два объекта могли вызывать мой обработчик таким образом, что (1) первому назначается набор данных, (2) второму назначается тот же набор данных до того, как экземпляр обработчика, первый обработавший его, удалил его и я предполагаю (3) второй случай ошибок обработчика при попытке удалить набор данных из коллекции ArrayCollection.

Я недостаточно знаком со средой выполнения Flash Player, чтобы знать, возможен ли этот сценарий сбоя, или мне нужно дополнительное время, чтобы установить какую-то блокировку, чтобы предотвратить ее.


Edit: ответы до сих пор дают блестящие отзывы о Flex, но я не уверен, что они отвечают на вопрос. Чтобы было ясно, я не пытаюсь решить, стоит ли использовать Flex.

Если у меня есть метод, который:

  1. Получает часть данных откуда-либо из коллекции ArrayCollection
  2. Что-то делает с этими данными
  3. Удаляет эти данные из коллекции ArrayCollection

Возможно ли, что другой вызов того же метода мог сделать # 1 после того, как первый вызов # 1, но до того, как # 3?

le dorfier, вы сказали, что Flex / AS "просто работает" - не могли бы вы пояснить, что в этом случае он будет "просто работать"?

Ответы [ 3 ]

8 голосов
/ 10 января 2009

Вам не нужно делать блокировку, но вы можете отслеживать порядок изменений вашего состояния. Различные асинхронные вызовы, которые находятся в игре, могут возвращать и изменять состояние вашей модели в порядке, отличном от того, когда были выполнены асинхронные вызовы.

Приложения Flex и AIR имеют однопоточную модель программирования. Однако их архитектура опирается на асинхронный ввод-вывод для взаимодействия с уровнем сервера.

Теперь в приложении Java Swing или приложении .NET Winforms можно выполнять операции ввода-вывода в фоновом потоке и маршалировать аргументы / результаты в основной поток GUI и из него. (Эти библиотеки графического пользовательского интерфейса не позволяют другим потокам изменять состояние объектов / виджетов графического инструментария, и, следовательно, взаимодействия данных должны передаваться в и из других потоков фоновой обработки.)

Напротив, библиотека классов ввода-вывода Flex и AIR написана там, где эти классы выполняют операции ввода-вывода асинхронно. Например, чтобы выполнить HTTP GET, можно вызвать метод send () HttpSerivce, который не является блокирующим вызовом. Вместо этого может быть предоставлено закрытие ActionScript3 для обработки результата всякий раз, когда вызов в конечном итоге завершается и возвращается.

В то же время приложение Flex / AIR позволяет графическому интерфейсу продолжать оставаться полностью интерактивным для пользователя. Он даже может отображать индикатор прогресса и / или кнопку отмены.

Таким образом, получается, что, хотя однопоточная модель графического интерфейса Flex / AIR проще и проще в программировании, чем многопоточные приложения Java Swing или .NET Winform, она способна на такое же сложное поведение пользовательского интерфейса, что и приложения. стиль полнофункциональных клиентских приложений.

Простой управляемый событиями однопоточный графический интерфейс, асинхронный ввод-вывод (через сервисные вызовы и / или обмен сообщениями) в сочетании с замыканиями ActionScript3 для обработки результатов или ошибок, является секретным рецептом Flex / AIR для мирового господства. (Конечно, я должен упомянуть хорошую поддержку свойств, событий и хорошее декларативное - или обязательное - связывание данных также как часть этой стратегии завоевания мира.)

2 голосов
/ 10 января 2009

Ответ на ваш вопрос, как вы его описали, - нет. Хотя знание регистрации событий, диспетчеризации событий, приоритетов, асинхронности и т. Д., Все это ценно, факт остается фактом, что вы выполняете работу по изменению ArrayCollection в области действия одной функции в главном потоке, за которой последует второй вызов этой функции, также в основном потоке - так что вам не о чем беспокоиться с точки зрения параллелизма: хотя это правда, что вы можете не знать, какой объект попадет первым (по многим причинам), вы можете уверен, что второй получит продукт работы, выполненной первым.

Так нет, ты в порядке. Рок дальше!

1 голос
/ 10 января 2009

После нескольких месяцев погребения во Flex и Actionscript я вернулся в .NET; и я немного ошеломлен всеми различными режимами, которые мне приходится выбирать - или, альтернативно, я должен выбирать и организовывать.

Напротив, Flex / AIR имеет в значительной степени один простой, но полный набор SDK-вызовов для манипулирования данными и файлами, каждый из которых имеет синхронные и асинхронные варианты. Гораздо проще понимать и использовать последовательно.

Роджер прямо из моего опыта. Flex / AS # просто работает. .NET, в порядке убывания (из-за опции перегрузки, ИМХО). Одним из следствий этого является то, что .NET лучше учитывает крайние сценарии; но если Flex / AS3 может удовлетворить ваши требования, он, вероятно, сделает это легко. Подумайте правило 80/20 (или, возможно, лучше)

Я думаю, что ваш вопрос был рассмотрен Роджером, но позвольте мне сказать это так, как мне кажется.

Ваш метод является однопоточным (вместе с другими действиями пользовательского интерфейса) в общем потоке пользовательского интерфейса. Но ресурсы (файлы, порты DBMS и т. Д.) Обычно проходят через простую последовательность, которую вы обычно настраиваете так:

  1. Создание объекта нужного класса ресурсов,
  2. Зарегистрировать обработчик события возврата для объекта (скажем, «fileonOpen»),
  3. Вызовите метод асинхронного выполнения для объекта (скажем, «file.open»).
  4. Продолжается цикл событий пользовательского интерфейса,
  5. Ресурс в конечном итоге завершает выполнение своего метода и запускает зарегистрированный обработчик событий, который теперь выполняется в потоке пользовательского интерфейса. Может быть, ответ на ваш вопрос заключается в том, что обработчику событий дан аргумент, который является объектом, к которому он относится так что вы можете удалить его из своей коллекции. Предположительно, ваш объект достаточно хорошо идентифицирован, чтобы избежать путаницы при работе с коллекцией, к которой он принадлежит. Если это строка результата базы данных, она, вероятно, будет знать свое собственное значение PK. Файловые объекты имеют такие свойства, как nativePath, isDirectory, parent (другой объект File) и т. Д.
...