2016-06-20 6 views
-3

hatte ich eine Funktion, die die folgende tat:Mit der Funktion mit Rückgabetyp Aufgabe <T>

public class UserClass 
    { 
    public static CurrentUserData GetUserInfo() 
    { 
     CurrentUserData ui; 
      ui = GetUserData(); 
     return ui; 
    } 
    } 

Mein CurrentUserData Objekt ist wie folgt:

public class CurrentUserData 
    { 
     public bool ReadOnly{get;set;} 
    } 

In meinem Controller, ich meine Methode aufrufen und kann Siehe die ReadOnly-Eigenschaft in Ordnung:

Ich musste meiner Funktion einen asynchronen Aufruf hinzufügen, und Jetzt sieht es so aus (ich habe den Code aus Platzgründen weggelassen):

public static Task<CurrentUserData > GetUserInfo() 
    { 
     Task<CurrentUserData > ui; 
      ui = GetUserData(); 
      HttpResponseMessage response = await httpClient.SendAsync(request); 
     return ui; 
    } 

Beachten Sie die Aufgabe, die ich hinzufügen musste. Aber wenn ich die Methode in meinem Controller wie vor anrufe, bekomme ich die Fehlermeldung:

Was muss ich so ändern, wenn jede Klasse meine neue Aufgabe Methode aufruft, wird er sehen, dass alle Eigenschaften des Objekts gewickelt in Aufgabe?

+4

Sie gehen müssen [async den ganzen Weg] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx ? f = 255 & MSPPError = -2147217396). Sie müssen alle Funktionen bis zum Controller asynchron ausführen. –

+0

Sie können dies überprüfen http://stackoverflow.com/questions/11853812/task-does-not-contain-a-definition-for-waetter – Prathyush

Antwort

5

Mark Ihre GetUserInfo Methode async und await die Aufgabe, die Sie auf die andere Methode zurückkehren:

public static async Task<UserClass> GetUserInfo() 
{ 
    Task<UserClass> ui = GetUserData(); 
    HttpResponseMessage response = await httpClient.SendAsync(request); 
    return ui; 
} 

//and then 
var user = await UserClass.GetUserInfo(); 
if (user.ReadOnly) 
{ 
    // code to execute 
} 

, dass die Aufgabe Wartezurück machen wird, bis es fertig ist, und dann können Sie mit dem resultierenden user Objekt weiter .

Vergewissern Sie sich, dass Sie async all the way befolgen.

+0

Vielen Dank. Ich habe ein paar Änderungen an meinem Code vorgenommen, aber das ist, was ich brauchte – BoundForGlory

+0

Sicher, Sie sind willkommen @BoundForGlory –

1

Correct Code

async Stichwort in der Vorderseite des Rückgabetyp sein muss.

public static async Task<UserClass> GetUserInfo() 
    { 
     Task<UserClass> ui; 
     ui = GetUserData(); 
     HttpResponseMessage response = await httpClient.SendAsync(request); 
     return ui; 
    } 

und verwenden Sie dann

var user = await UserClass.GetUserInfo(); 
if (user.ReadOnly) 
{ 
    // your code here 
} 
+0

Dies behebt nur einen der beiden Fehler der OP hat. –

+0

@cFrozenDeath warum runter? –

+0

Entfernt es, lesen Sie meinen Kommentar –

0

Zunächst sollte dies auch nicht kompiliert sein, wenn das Verfahren mit dem await Operator auch ist async:

public static async Task<CurrentUserData> GetUserInfo() 

Sobald das der Fall ist warten Sie einfach auf die Methode wie jede andere async Methode:

var user = await UserClass.GetUserInfo(); 

, die sich in einer async Methode wären:

public static async Task<CurrentUserData> GetUserInfo() 

und so immer auf dem Weg an die Spitze des Stapels.

1

Sie sollten Ihren Aufruf an UserClass erwarten.GetUserInfo();

var user = await UserClass.GetUserInfo(); 
if (user.ReadOnly){ 
     ////code to execute 
} 

und die Methodensignatur sein sollte:

public async static Task<CurrentUserData> GetUserInfo() 
Verwandte Themen