Existe uma diferença significativa entre fazer um [IsOneWay = true] async do serviço WCF e chamar o método de sincronização usando uma tarefa no cliente?
Se eu tenho um serviço definido assim:
[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public interface IMyService
{
[OperationContract(IsOneWay = true)]
[ReceiveContextEnabled(ManualControl = true)]
void DoSomething(Message<XElement> message);
}
e eu quero chamá-lo de forma assíncrona do meu cliente (usando contratos compartilhados não gerando de svcutil ou adicionar referência de serviço) eu posso fazer:
Task task = Task.Factory.StartNew(() => myService.DoSomething(message));
... some other code
task.Wait();
Eu também poderia definir meu serviço como assí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);
}
e faça isso
IAsyncResult result = myService.BeginDoSomething(message, null, null);
.... some other code
myService.EndDoSomething(result);
Existem diferenças significativas entre as abordagens?