0

以下に示すコードがあるとします。

LoadOperation lop=_dsrvX.Load(_dsrvX.GetUserDetails(userID));
lop.Completed +=(s,a)=>
{
  Debug.WriteLine("Completed but,
           First I load it then I registered Completed evet!");
}

このタイプコードはどこにでもあるので、正しいのだろうか?

私が知っているように、domainServiceメソッドを呼び出すと、これはドメインサービスオブジェクトの関連するEntitySetを自動的に埋めます。

LoadOperation(Submit、Invoke ops。)が迅速に完了し、完了したイベントを登録する次の行に移動したときに、すべてが完了したとします。それを達成するのは難しいようですが、100%保証をいただけますか?

OperationBaseオブジェクトを手動で呼び出すメソッドがあるかどうかを尋ねていることを保証できない場合は?

コメントをいただければ幸いです。

4

2 に答える 2

2

まあ、これはクレイジーな世界です、私は何も100%保証するつもりはありません:P-しかし、私はそれが問題になるべきではないと思います。これが気になる場合は、次のようにコールバックをパラメーターとして渡すことができます。

_dsrvX.Load(_dsrvX.GetUserDetails(userID), userDetailsCallBack, null);

(...)

void userDetailsCallBack(LoadOperation<UserDetails> op)
{
   //do anything with the results
}

または、さらに単純化するには:

_dsrvX.Load(_dsrvX.GetUserDetails(userID), (op)=>
   {
       //do anything with the results  
   }, null);
于 2012-06-05T21:48:07.813 に答える
1

はい、あなたはそれを信頼することができます-100%保証されています!

非同期 メソッドの背後にあるコードを掘り下げるLoadと、実際のロードを実行するために別のスレッドを起動し、すぐに戻ることがわかります。

次に、その別のスレッドがサービスコールの準備をし、サービスコールを実行し、最終的に結果のデータを返します。

それがすべて完了するまで、Completedイベントをトリガーすることはできません。また、Webサービスを待機することは言うまでもなく、「多くの」コードを処理する必要がありますが、スレッドが開始された後、戻りはほぼ瞬時に行われます。つまり、他のスレッドが完了して中断する可能性はありません。

次の行にハンドラーを追加する前に、ロードが完了する可能性は0%です。

通常のアプローチは、代わりにコールバックまたは匿名メソッドを提供することですが、既存のコードは問題ありません。MSは、そのように設計したときに彼らが何をしていたかを知っていました:)

私はジョン・スキートと関連する質問についてこの議論をしました、そして彼の反応はあなたが方法が何をしているのかわからないLoadのでそれがリターンよりも速く起こるかもしれないということでした...私の実用的な答えは私たちが正確に何を知っているかということでした設計上、進行中であり、ロードが開始される前に100%戻ります

于 2012-06-06T10:20:32.893 に答える