I talked to another developer about this and he proposed to do the following:
1. In the ExtentChanged, if you are only concerned with the zoom, compare the map's previous resolution with its current resolution to rule out the pan because dragging the map also fires this event.
2. Before calling DistanceAsync, it might be a good idea to pass in Polyline instead of MapPoint and also using the map's center as the location and the map's resolution as length of Polyline. You can see the attached image.
In this example, the old extent is the blue rectangle, the new extent is the red rectangle. You get each of their centers to dictate your Polyline's position. The length of these polylines will be the zoom factor (map units divided by pixels). Map units is the distance between your upper left and upper right corners and pixels is 300.
It might be worth to try this approach too.
Jennifer