4

いくつかの入力データを処理する準備ができたら、ハンドラーを呼び出すいくつかのオブジェクトを開始している状況があります。

そのハンドラーは、保留中の要求のArrayCollectionからデータセットを取得し、それをオブジェクトに割り当て、ArrayCollectionからデータセットを削除します。

(適切なデータセットを見つけるためにArrayCollectionを検索する必要があるため、ArrayCollectionからポップできません。常に一番上にあるとは限りません。)

(1)最初のオブジェクトにデータセットが割り当てられ、(2)最初のオブジェクトにサービスを提供するハンドラーのインスタンスがそれを削除する前に2番目のオブジェクトに同じデータセットが割り当てられるように、2つのオブジェクトが私のハンドラーを呼び出す可能性はありますか? (3)ArrayCollectionからデータセットを削除しようとしたときのハンドラーエラーの2番目のインスタンス。

私はFlashPlayerランタイムに精通していないため、この障害シナリオが可能かどうか、またはそれを防ぐために何らかのロックを設定するために余分な時間をかける必要があるかどうかを知ることができません。


編集:これまでの回答はFlexの熱烈なレビューを示していますが、彼らが質問に回答するかどうかはわかりません。明確にするために、私はFlexを使用するかどうかを決定しようとはしていません。

次のような方法がある場合:

  1. ArrayCollectionのどこかからデータを取得します
  2. そのデータで何かをします
  3. そのデータをArrayCollectionから削除します

同じメソッドの別の呼び出しが、最初の呼び出しが#1を実行した後、#3を実行する前に#1を実行する可能性はありますか?

le dorfier、Flex / ASは「正しく機能する」とおっしゃいましたが、この場合は「正しく機能する」ことを明確にできますか?

4

3 に答える 3

8

ロックを行う必要はありませんが、状態の変更の順​​序を追跡することをお勧めします。実行中のさまざまな非同期呼び出しは、非同期呼び出しが発行されたときとは異なる順序でモデルの状態を返し、変更する可能性があります。

FlexおよびAIRアプリケーションには、シングルスレッドプログラミングモデルがあります。ただし、それらのアーキテクチャは、サーバー層との対話を非同期I/Oに依存しています。

現在、JavaSwingアプリまたは.NETWinformsアプリでは、バックグラウンドスレッドでi / oインタラクションを実行し、メインGUIスレッドとの間で引数/結果をマーシャリングする場合があります。(これらのグラフィカルUIライブラリは、他のスレッドがグラフィカルツールキットオブジェクト/ウィジェットの状態を変更することを許可しないため、データの相互作用を他のバックグラウンド処理スレッドとの間でマーシャリングする必要があります。)

対照的に、FlexとAIRのi / oクラスライブラリは、これらのクラスが非同期でi/o操作を実装する場所に記述されています。たとえば、HTTP GETを実行するには、HttpSerivce send()メソッドを呼び出すことができますが、これはブロッキング呼び出しではありません。代わりに、ActionScript3クロージャを提供して、呼び出しが最終的に完了して戻るたびに結果を処理できます。

その間、Flex / AIRアプリは、GUIがユーザーに対して完全にインタラクティブであり続けることを許可できます。進行状況インジケーターやキャンセルボタンを表示することもできます。

したがって、Flex / AIRシングルスレッドGUIモデルは、マルチスレッドJavaSwingまたは.NETWinformアプリケーションよりも単純でプログラミングが簡単ですが、これらのリッチスタイルと同じ種類の洗練されたUI動作が可能であることがわかります。クライアントアプリケーション。

単純なイベント駆動型のシングルスレッドGUI、非同期I / O(サービス呼び出しやメッセージングを介して)、および結果や障害を処理するためのActionScript3クロージャーと組み合わせることは、世界を支配するためのFlex/AIRシークレットレシピです。(もちろん、この世界征服戦略の一環として、プロパティ、イベント、および優れた宣言型(または命令型)のデータバインディングに対する優れたサポートについても言及する必要があります。)

于 2009-01-10T01:55:10.417 に答える
2

あなたが説明したように、あなたの質問に対する答えはノーです。イベントの登録、イベントのディスパッチ、優先順位、非同期性などについて知っておくことはすべて重要ですが、メイン スレッドの単一の関数のスコープ内で ArrayCollection を変更する作業を行っているという事実に変わりはありません。その関数の 2 回目の呼び出しも、メイン スレッド上で行われます。したがって、同時実行性に関して心配する必要はありません。確かに、どのオブジェクトが最初にそこに到達するかはわかりませんが (多くの理由で)、確かに、2 番目のものは、最初のものによって実行された作業の成果物を取得します。

いいえ、大丈夫です。ロックオン!

于 2009-01-10T17:48:53.597 に答える
1

数か月間 Flex と Actionscript に没頭した後、.NET に戻りました。そして、選択しなければならないさまざまなモードのすべてに少し圧倒されます-または、代わりに、選択して調整する必要があります.

対照的に、Flex/AIR には、データとファイルを操作するための単純だが完全な SDK 呼び出しのセットがほぼ 1 つあり、それぞれに同期バリアントと非同期バリアントがあります。理解しやすく、一貫して使用する方がはるかに簡単です。

ロジャーは私の経験から正しい。Flex/AS# ジャスト ワークス。.NET、ますますそうです(オプションのオーバーロード、IMHOから)。結果の 1 つは、.NET がエッジ シナリオにより適していることです。しかし、Flex/AS3 が要件を処理できる場合は、おそらく簡単に処理できます。80/20 ルールを考えてください (または、おそらくそれ以上です)。

あなたの質問はロジャーによって解決されたと思いますが、私が聞いたと思う方法で言わせてください。

メソッドは、共通の UI スレッドで (他の UI アクティビティと共に) シングルスレッドです。ただし、リソース (ファイル、dbms ポートなど) は通常、次のように設定する単純なシーケンスを通過します。

  1. 目的のリソース クラスのオブジェクトをインスタンス化します。
  2. オブジェクトの戻りイベントのイベント ハンドラーを登録します (「fileonOpen」など)。
  3. オブジェクトの非同期実行メソッドを呼び出します (「file.open」など)。
  4. UIイベントループは続き、
  5. リソースは最終的にそのメソッドの実行を完了し、登録したイベント ハンドラーを起動します。これは現在 UI スレッドで実行されています。おそらく、あなたの質問に対する答えは、イベント ハンドラーには関連するオブジェクトである引数が与えられているということです。コレクションから削除できます。おそらく、あなたのオブジェクトは、それが属するコレクションを扱う際の混乱を防ぐために十分に自己識別されています。それがデータベースの結果行である場合、おそらくそれ自体の PK 値を知っているでしょう。File オブジェクトには、nativePath、isDirectory、parent (別の File オブジェクト) などのプロパティがあります。
于 2009-01-10T02:00:31.437 に答える