Delegate.EndInvoke is documented as a thou shalt call this (i.e. necessary – else leaks happen) – from msdn:
Important Note
No matter which technique you use,
always call EndInvoke to complete your
asynchronous call.
Control.EndInvoke is OK to ignore for fire-and-forget methods – from msdn:
You can call EndInvoke to retrieve the
return value from the delegate, if
neccesary, but this is not required.
However – if you are using Delegate.BeginInvoke
and don’t want the result, consider using ThreadPool.QueueUserWorkItem
instead – it’ll make life a lot easier, and avoid the pain of IAsyncResult
etc.