我在内存分配方面有点n00b,但我试图了解如何将 AsyncCallbacks 与 BeginInvoke 类型设计模式一起使用可能会导致内存分配,从而可能导致更频繁地调用垃圾收集器。
例如,如果我有一个带有我希望通过回调异步调用的事件的类,我通常会按如下方式设置它:
方法一
public class PriceBook
{
private double Value;
public void UpdateValue(double Value)
{
this.Value = Value;
}
public event EventHandler ValueUpdated;
private void DoValueUpdated(double Value)
{
if (ValueUpdated != null)
{
ValueUpdated.BeginInvoke(this, EventArgs.Empty, ValueUpdateCompleted, Value);
}
}
private void ValueUpdateCompleted(IAsyncResult ar)
{
// Do something when event has finished being called.
}
}
与我一起工作的人说,以这种方式调用 BeginInvoke 实际上是通过在每次调用时创建一个新的 AsyncCallback 来分配内存。所以,他建议这样做:
方法二
public class PriceBook
{
private AsyncCallback ValueUpdateCallback;
private double Value;
public PriceBook1()
{
ValueUpdateCallback = ValueUpdateCompleted;
}
public void UpdateValue(double Value)
{
this.Value = Value;
DoValueUpdated(Value);
}
public event EventHandler ValueUpdated;
private void DoValueUpdated(double Value)
{
if (ValueUpdated != null)
{
ValueUpdated.BeginInvoke(this, EventArgs.Empty, ValueUpdateCallback, Value);
}
}
private void ValueUpdateCompleted(IAsyncResult ar)
{
// Do something when event has finished being called.
}
}
如您所见,这里我在构造函数中设置了一次 AsyncCallback。方法二真的可以节省内存分配吗?这两种方法还有其他好处吗/是否有更好的方法来完成我想做的事情?
- 威廉