2009-05-19 10 views
0
Action<SPItemEventProperties> deleteAction = DeleteWorkspace; 
    AsyncCallback deleteDone = deleteAction.EndInvoke; 
    SPSecurity.RunWithElevatedPrivileges(() => deleteAction.BeginInvoke(properties, deleteDone, null)); 

これは、非同期にDeleteWorkspaceを呼び出して、EndInvokeを呼び出したときに書きましたが、正しく動作するとは限りません。私はステップを踏んだが、それは動作するように見えるが、シンタックスは自分自身を二番目に推測させている。ネット上でこれを見たことがないからだ。この非同期ラムダ暗号は私の考えることをしていますか?

コメント?

答えて

1

それは動作するはずですが、本当に理解するためには、のは、それがこのように書かれたふりをしてみましょう:上記のコードでは、それはすぐにスコープの外に行こう「完了」コールバックのように見えること

void RunAsync<T>(Action<T> action) 
{ 
    AsyncCallback Done = action.EndInvoke; 
    SPSecurity.RunWithElevatedPrivileges(() => action.BeginInvoke(properties, Done, null)); 
} 

RunAsync(DeleteWorkspace); 

注意。しかし、コンパイラはクロージャを使用してクロージャをクローズするので、必要なときに使用できます。

+0

私の質問だったJoelさん、ありがとうございました。私は閉鎖の使用を強制するとは思っていませんでした。あなたはどのようにbtwを確認できますか?しかし、答えをありがとう! – emalamisura

+0

ラムダに変数を渡すたびに、クロージャが使用されます。それに気づくのは難しいことです。 –

+0

うん、それは絶対に当てはまる。楽しみのために、逆コンパイルされたコードを見てください。つまり、 "ローカル変数"は実際にはC#コンパイラが作成した新しいクラスのメンバになります。 –

関連する問題