¿Hay una diferencia significativa entre hacer que el servicio WCF [IsOneWay = true] sea asíncrono y llamar al método de sincronización utilizando una tarea en el cliente?

Si tengo un servicio definido así:

[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface IMyService
{
    [OperationContract(IsOneWay = true)]
    [ReceiveContextEnabled(ManualControl = true)]
    void DoSomething(Message<XElement> message);
}

y quiero llamarlo de forma asincrónica desde mi cliente (utilizando contratos compartidos que no se generan desde svcutil o agregar una referencia de servicio) Puedo hacer:

Task task = Task.Factory.StartNew(() => myService.DoSomething(message));

... some other code

task.Wait();

También podría definir mi servicio como asíncrono:

[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface ICacheKeyExchangeAsync
{
    [OperationContract(IsOneWay = true, AsyncPattern = true)]
    [ReceiveContextEnabled(ManualControl = true)]
    IAsyncResult BeginDoSomething(Message<XElement> message, AsyncCallback callback, object state);
    void EndDoSomething(IAsyncResult result);
}

y haz esto en su lugar

IAsyncResult result = myService.BeginDoSomething(message, null, null);

.... some other code

myService.EndDoSomething(result);

¿Existen diferencias significativas entre los enfoques?

Respuestas a la pregunta(2)

Su respuesta a la pregunta