我在 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 或定义回调(例如内存泄漏)的风险?什么是最佳实践。
赛斯