it-swarm.com.de

Task <> enthält keine Definition für 'GetAwaiter'

Klient

iGame Channel = new ChannelFactory<iGame> ( new BasicHttpBinding ( BasicHttpSecurityMode . None ) , new EndpointAddress ( new Uri ( "http://localhost:58597/Game.svc" ) ) ) . CreateChannel ( );

public Task<SerializableDynamicObject> Client ( SerializableDynamicObject Packet )
{
    return Task<SerializableDynamicObject> . Factory . FromAsync ( Channel . BeginConnection , Channel . EndConnection , Packet , null );
}

Vertrag

    [OperationContract ( AsyncPattern = true )]
    IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State );

    SerializableDynamicObject EndConnection ( IAsyncResult Result );

Bedienung

public IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State )
{
    dynamic Request = Message;
    dynamic Response = new SerializableDynamicObject ( );
    if ( Request . Operation = "test" )
    {
        Response . Status = true;
    }
    Response . Status = false;

    return new CompletedAsyncResult<SerializableDynamicObject> ( Response );
}

public SerializableDynamicObject EndConnection ( IAsyncResult Result )
{
    return ( Result as CompletedAsyncResult<SerializableDynamicObject> ) . Data;
}

Bereitstellen des Dienstes vom Silverlight-Client

private async void myButton ( object sender , RoutedEventArgs e )
{
    dynamic Request = new SerializableDynamicObject ( );
    Request . Operation = "test";

    var task = Client ( Request );
    var result = await task;  // <------------------------------ Exception
}

Ausnahme

Task<SerializableDynamicObject > does not contain a definition for 'GetAwaiter'

Was ist falsch?


Bearbeiten 1:

Kurz,

Visual Studio 2012 RC Silverlight 5-Anwendung verwendet Spiel WCF 4-Dienst, der in ASP.net 4-Anwendung mit ChannelFactory-Technik über Shared Portable Library .NET4/SL5 gehostet wird enthält die Schnittstelle iGame mit Async CTP

Grafik:
ASP.NET <= Klassenbibliothek (Spiel) <= Portable Library (iGame) => Silverlight


Bearbeiten 2:

  • Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll wurde meinem SL5-Client hinzugefügt
  • using System. Einfädeln. Aufgaben;
40
Ahmed Ghoneim

GetAwaiter(), das von await verwendet wird, ist als Erweiterungsmethode im Async-CTP implementiert. Ich bin nicht sicher, was Sie genau verwenden (Sie erwähnen in Ihrer Frage sowohl das Async CTP als auch das VS 2012 RC), aber das Async-Targeting-Pack verwendet möglicherweise dieselbe Technik.

Das Problem ist dann, dass Erweiterungsmethoden mit dynamic nicht funktionieren. Sie können explizit angeben, dass Sie mit einer Task arbeiten. Dies bedeutet, dass die Erweiterungsmethode funktioniert und wechseln Sie dann wieder zu dynamic:

private async void MyButtonClick(object sender, RoutedEventArgs e)
{
    dynamic request = new SerializableDynamicObject();
    request.Operation = "test";

    Task<SerializableDynamicObject> task = Client(request);
    dynamic result = await task;

    // use result here
}

Da die Client()-Methode eigentlich nicht dynamisch ist, können Sie sie mit SerializableDynamicObject und nicht mit dynamic aufrufen und so die Verwendung von dynamic so weit wie möglich einschränken:

private async void MyButtonClick(object sender, RoutedEventArgs e)
{
    var request = new SerializableDynamicObject();
    dynamic dynamicRequest = request;
    dynamicRequest.Operation = "test";

    var task = Client(request);
    dynamic result = await task;

    // use result here
}
14
svick

Ich hatte dieses Problem in einem meiner Projekte, wo ich festgestellt hatte, dass ich meine Projekte .net-Version auf 4.0 gesetzt hatte und asynchrone Aufgaben nur in .net 4.5 auf den Stationen unterstützt werden.

Ich habe einfach meine Projekteinstellungen geändert, um .net 4.5 oder höher zu verwenden, und es hat funktioniert.

80
Zapnologica

Sie müssen das Microsoft.Bcl.Async NuGet-Paket installieren, um async/await-Konstrukte in pre-.NET 4.5-Versionen verwenden zu können (z. B. Silverlight 4.0+).

Nur zur Verdeutlichung - dieses Paket wurde früher Microsoft.CompilerServices.AsyncTargetingPack genannt und einige alte Tutorials verweisen immer noch darauf.

Werfen Sie einen Blick auf hier für Informationen von Immo Landwerth.

30
Pawel Hofman

Erlebte dies gerade in einer Methode, die eine linq-Abfrage ausführt.

public async Task<Foo> GetSomething()
{
    return await (from foo in Foos
                  select foo).FirstOrDefault();
}

Benötigt stattdessen .FirstOrDefaultAsync(). N00b Fehler.

17
JOpuckman

Sie können weiterhin Framework 4.0 verwenden, müssen jedoch getawaiter für die Klassen angeben:

MethodName(parameters).ConfigureAwait(false).GetAwaiter().GetResult();

3
Abhi

Stellen Sie sicher, dass Ihre .NET-Version 4.5 oder höher ist

1
Oranit Dar

Ich hatte dieses Problem, weil ich eine Methode aufrief

await myClass.myStaticMethod(myString);

aber ich habe meinString mit eingestellt 

var myString = String.Format({some dynamic-type values})

was zu einem dynamic-Typ und nicht zu einer string führte. Als ich auf myClass.myStaticMethod(myString) warten wollte, dachte der Compiler, ich wollte myClass.myStaticMethod(dynamic myString) aufrufen. Dies wurde gut kompiliert, da es wiederum in einem dynamischen Kontext alles gut ist, bis es zur Laufzeit explodiert. Dies ist der Fall, da keine Implementierung der dynamischen Version von myStaticMethod vorhanden ist. Und die Tatsache, dass Intellisense mich zur korrekten Definition bringen würde, half auch nicht.
Trickig!

Indem Sie den Ergebnistyp in eine Zeichenfolge zwingen, wie: 

var myString = String.Format({some dynamic-type values})

zu 

string myString = String.Format({some dynamic-type values})

mein Anruf an myStaticMethod wurde ordnungsgemäß weitergeleitet

1
Sean

In meinem Fall fügen Sie einfach using System; das Problem hinzu.

0
user632095
public async Task<model> GetSomething(int id)
{
    return await context.model.FindAsync(id);
}