2017-08-31 2 views
2

Ich weiß nicht, was ist falsch mit diesem Code, aber es reagiert immer noch nicht den benötigten Wert.Stuck mit Async Aufgabe und warten

Hier ist mein Beispielcode:

WebAPI 2:

KOTController.cs

[HttpGet] 
[Route("testasync")] 
public IHttpActionResult TestAsync() 
{ 
    try 
    { 
     return Ok(_iKOTManager.TestAsync()); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     return null; 
    } 
} 

Schnittstelle

IKOTManager.cs

Task<int> TestAsync(); 

KOTManager.cs

public async Task<int> TestAsync() 
{ 
    return await Task.Run<int>(() => 
    { 
     return 999 + 23; 
    }); 
} 

Wenn ich eine Anfrage an dieses API senden, gibt es so etwas wie dieses nicht die Anzahl

<TaskOfint xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Threading.Tasks"/>

Jeder Rat wäre wirklich hilfreich. Vielen Dank.

+3

Refactor die Aktion, um Aufgabe zurückzugeben und warten Sie dann Methode auf Schnittstelle – Nkosi

Antwort

4

Sie erhalten diese Antwort, weil Sie die Aufgabe zurückgeben und nicht tatsächlich ausführen. Das Framework serialisiert das Task-Objekt und gibt es zurück.

Umgestalten die Aktion zurückzukehren Task und dann await die Methode auf der Schnittstelle

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() { 
    try { 
     return Ok(await _iKOTManager.TestAsync()); 
    } catch (Exception ex) { 
     logger.Error(ex); 
     return InternalServerError(); 
    } 
} 

Referenz: Async/Await - Best Practices in Asynchronous Programming

Zusätzlich im Fall der Ausnahme sollten Sie ein entsprechendes Ergebnis statt null zurückzukehren. Dies sollte eventuell umgestaltet werden, da Fehler in der Steuerung als cross-cutting concern betrachtet werden. Controller sollten so schlank wie möglich sein.

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() { 
    return Ok(await _iKOTManager.TestAsync()); 
} 
3

Sie müssen Ihren Controller zu async und dann await die Aufgabe ändern. das heißt

public async Task<IHttpActionResult> TestAsync() 

...

return Ok(await _iKOTManager.TestAsync()); 

finden Sie in der Dokumentation für async/awaithere.

0

Ihre Aktion-Methode async Verfahren verbraucht/calling, müssen Sie Ihre Aktion-Methode als auch Asynchron zurückzukehren Task<T> als Rückgabetyp wie machen:

[HttpGet] 
[Route("testasync")] 
public async Task<IHttpActionResult> TestAsync() 
{ 
    try 
    { 
     return Ok(await _iKOTManager.TestAsync()); 
    } 
    catch (Exception ex) 
    { 
     logger.Error(ex); 
     return null; 
    } 
} 

Wenn wir fordern eine async Methode, wenn möglich sollten wir die Calling-Side-Methode sowie async und geben Sie Task<T> in allen Aufruf-Ketten.

Hoffe es hilft!