2016-12-19 2 views
-1

ich auf Async webservice Anruf gerade arbeite und mit dieser Aufgabe spielte und warten Bau:Async Aufgabe und warten in C#

private static async Task<RSAParameters> GetPublicSecretKey(ICoreIdentityService identityChannel) 
{ 
     Object state = null; 
     var t = Task<RSAParameters>.Factory.FromAsync(
      identityChannel.BeginGetPublicKey, 
      identityChannel.EndGetPublicKey, 
       null, state, TaskCreationOptions.None); 
     return await t; 
} 

//Methods definition: 
//IAsyncResult BeginGetPublicKey(AsyncCallback callback, object asyncState) 
//RSAParameters EndGetPublicKey(IAsyncResult result) 

Aufbau der Code, den ich der Typ Argumente für die Methode bekommen .... kann nicht sein, aus der Nutzung abgeleitet. Fehle ich etwas?

Vielen Dank im Voraus. Cheers, Inoel

Task and Await Error

Modified kompilierten Code:

var t = Task<RSAParameters>.Factory.FromAsync(
    identityChannel.BeginGetPublicKey, 
    identityChannel.EndGetPublicKey, 
    TaskCreationOptions.None); 
+0

Ich denke, der einfachste Weg wäre 'Rückkehr erwarten Factory.FromAsync ...' – RandomStranger

+0

Keine Notwendigkeit, eine Aufgabe abzuwarten, wenn Sie einfach zurückgeben werden. Nur 'Return Factory.FromAsync' –

Antwort

2

Es scheint, dass Sie die FromAsync() -Methode mit dem Parameter in einer unerwarteten Reihenfolge aufrufen.

Die Fehlermeldung selbst schlägt vor, explizit Ihre Parameter zu benennen, so dass Ihr Code etwas entlang der Linien von aussehen:

var t = Task<RSAParameters>.Factory.FromAsync(
       asyncResult: identityChannel.BegineGetPublicKey, 
       endMethod: identityChannel.EndGetPublicKey, 
       creationOptions: TaskCreationOptions.None, 
       scheduler: state); 

Alternativ können Sie die Reihenfolge der Parameter korrigieren könnte, und dies sollte das Problem lösen . Die nächste Überlastung ich finden kann, ist dies:

public Task<TResult> FromAsync<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions); 

Also vorausgesetzt, Sie beabsichtigen, diese zu verwenden, wird Ihr Code müssen etwas in der Art der arg1 passieren modifiziert werden, und arg2, gelangen dann in einer zusätzlichen Parameter:

Object state = null; 
var t = Task<RSAParameters>.Factory.FromAsync<TArg1, TArg2>(
      beginMethod: identityChannel.BeginGetPublicKey, 
      endMethod: identityChannel.EndGetPublicKey, 
      arg1: null, // Either arg1, or arg2 is missing 
      arg2: null, // from your code 
      state: state, 
      creationOptions: TaskCreationOptions.None); 

return t; 

ich die genannten Parameter hier für Klarheit verlassen haben, aber Sie sollten diese entfernen können, wenn Sie es vorziehen.

+0

Danke für Ihren Vorschlag :) – Inoel

+1

' Rückkehr warten t; 'sollte durch' return t; 'ersetzt werden. Es macht keinen Sinn, das Ergebnis * zu warten, wenn Sie eine Aufgabe zurückgeben. Der Kunde muss sowieso "warten". Sie verschwenden gerade CPU-Zeit, indem Sie einen doppelten Zustandsautomaten erzeugen –

+0

Guter Punkt - ich habe die Antwort aktualisiert, um das zu reflektieren. –