Gibt es einen signifikanten Unterschied zwischen dem asynchronen Ausführen eines [IsOneWay = true] WCF-Diensts und dem Aufrufen der Synchronisierungsmethode mithilfe einer Task auf dem Client?

Wenn ich einen Service so definiert habe:

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

und ich möchte es asynchron von meinem Client aus aufrufen (indem ich geteilte Verträge verwende, die nicht aus svcutil generiert werden, oder eine Dienstreferenz hinzufüge), kann ich Folgendes tun:

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

... some other code

task.Wait();

Ich könnte meinen Dienst auch als asynchron definieren:

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

und mach das stattdessen

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

.... some other code

myService.EndDoSomething(result);

Gibt es signifikante Unterschiede zwischen den Ansätzen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage