メソッドを非同期的に呼び出すことに関するCodeProjectの次のコードスニペットを... http://www.codeproject.com/Articles/14931/Asynchronous-Method-Invocationで見つけました。
private void CallFooWithOutAndRefParameters()
{
// create the paramets to pass to the function
string strParam1 = "Param1";
int intValue = 100;
ArrayList list = new ArrayList();
list.Add("Item1");
// create the delegate
DelegateWithOutAndRefParameters delFoo =
new DelegateWithOutAndRefParameters(FooWithOutAndRefParameters);
// call the beginInvoke function!
IAsyncResult tag =
delFoo.BeginInvoke(strParam1,
out intValue,
ref list,
null, null);
// normally control is returned right away,
// so you can do other work here...
// calling end invoke notice that intValue and list are passed
// as arguments because they might be updated within the function.
string strResult =
delFoo.EndInvoke(out intValue, ref list, tag);
// write down the parameters:
Trace.WriteLine("param1: " + strParam1);
Trace.WriteLine("param2: " + intValue);
Trace.WriteLine("ArrayList count: " + list.Count);
Trace.WriteLine("return value: " + strResult);
}
このコードについて私が理解していないことがいくつかあります。
コメントごとに、コントロールはBeginInvoke行に到達するとすぐに呼び出し元のコードに返されます。
これは、次のコード(EndInvokeの後にトレースログが続く)が、FooWithOutAndRefParameters呼び出しが完了した後にのみ実行されることを意味します...自動的に(そのコードが同じメソッドに存在する場合でも)。それは私には少し混乱しているように見えます。(私はいつもこの種のことのためにコールバックを使用しました。)
このメソッドを使用して、EndInvokeを呼び出す必要がありますか。メソッドを非同期で呼び出して、それが発生したことを忘れることはできますか?これの欠点はありますか?
EndInvokeを呼び出さない場合(このメソッドに示されているように)、常にコールバックが必要ですか?コールバックが何もしない場合でも。
答えがあなたがすべきであるなら...それならあなたはEndInvokeを呼び出すか、それともコールバックを定義しますか?(コールバックを定義することの利点は、結果が通知されることです)
ところで、EndInvokeまたはコールバックでエラーをチェックしたり結果をログに記録したりできることはわかっています(実際にはそうするかもしれません)。私が疑問に思っていたのは、EndInvokeを呼び出さなかったり、コールバックを定義したりしないことによるリスクがありますか(たとえば、メモリリーク)?ベストプラクティスは何ですか。
セス