Czy istnieje znacząca różnica między wykonaniem asynchronicznej usługi [IsOneWay = true] WCF i wywołaniem metody synchronizacji przy użyciu zadania na kliencie?

Jeśli mam zdefiniowaną usługę:

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

i chcę nazwać go asynchronicznie od mojego klienta (używając umów udostępnionych, które nie generują z svcutil ani nie dodają odwołania do usługi) mogę zrobić:

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

... some other code

task.Wait();

Mógłbym również zdefiniować moją usługę do asynchronizacji:

[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);
}

i zrób to zamiast tego

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

.... some other code

myService.EndDoSomething(result);

Czy istnieją znaczne różnice między podejściami?

questionAnswers(2)

yourAnswerToTheQuestion