No, not after the whole thing has finished. You are creating one Ping object for every iteration of your loop so you have to cleanup every single one of those objects. There will be one event raised for every object so you have to cleanup in the event handler every time. As with all event handlers, the 'sender' parameter is the object that raised the event, i.e. the Ping object. That's how you access the object, not a member variable:
vb.net Code:
Dim myPing = DirectCast(sender, Ping)
RemoveHandler myPing.PingCompleted, AddressOf PingComplete
myPing.Dispose()