¿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?