Как сказал SLaks, EndInvoke
страхует от утечек памяти.
BeginInvoke
все еще асинхронный; рассмотрим следующий код:
static void Main() {
Func<double> slowCalculator = new Func<double>(PerformSlowCalculation);
IAsyncResult slowCalculation = slowCalculator.BeginInvoke(null, null);
// lots of stuff to do while slowCalculator is doing its thing
Console.WriteLine("Result is {0}", slowCalculator.EndInvoke(slowCalculation));
}
static double PerformSlowCalculation() {
double result;
// lots and lots of code
return result;
}
Если бы этот код был написан без вызовов BeginInvoke
/ EndInvoke
, PerformSlowCalculation
должен был бы завершиться до того, как Main
сможет выполнить остальную часть "множества вещей"; таким образом, эти два события могут происходить одновременно.
Теперь, в вашем примере, использующем GenerateXmlDelegate
, вам все еще нужен EndInvoke
, даже если вы ничего не возвращаете. Способ сделать это:
static void Main(string[] args) {
GenerateXmlDelegate worker = new GenerateXmlDelegate(GenerateMainXml);
IAsyncResult result = worker.BeginInvoke(GenerateXmlComplete, null);
}
private static void GenerateXmlComplete(IAsyncResult result) {
AsyncResult realResult = result as AsyncResult;
GenerateXmlDelegate worker = result.AsyncDelegate as GenerateXmlDelegate;
worker.EndInvoke();
}