pingSender.SendAsync() shouldn't be executed from a new thread since SendAsync will not block the calling thread. It puts it on the thread pool automatically.

Also for a 32 byte buffer:
byte[] buffer = new byte[32];

Finally, get rid of AutoResetEvent. I have never used it, I don't see why you should need it for a simple async ping request.

@Angeix: locks aren't needed here.