Похоже, что это потокобезопасно.
Поскольку ваш делегат "SendCallback" выполняется в новом потоке, я бы предположил, что EndSend () может сказать, какую асинхронную операцию вы завершаете, основываясь на текущем контексте потока.
См.MSDN "Best Practices" для модели асинхронного программирования:
Simultaneously Executing Operations
If your class supports multiple concurrent invocations, enable the developer to track each invocation separately by defining the MethodNameAsync overload that takes an object-valued state parameter, or task ID, called userSuppliedState. This parameter should always be the last parameter in the MethodNameAsync method's signature.
http://msdn.microsoft.com/en-us/library/ms228974.aspx