2016-05-04 3 views
5

Sto chiamando un metodo in Web API (C#) dal repository. Il metodo è repository non restituisce nulla. È vuoto. dovrei tornare nel mio metodo API poiché un metodo asincrono non può avere un tipo di reso Void.How Return Void in Async Method in Web API

Questo è il mio metodo asincrono in API:

[HttpPost] 
    [Route("AddApp")] 
    public async Task<?> AddApp([FromBody]Application app) 
    {   
     loansRepository.InsertApplication(app); 
    } 

e questo è EntityFrame Inserire il lavoro in repository (posso COT cambiamento questo proposito)

 public void InsertApplication(Application app) 
    { 

     this.loansContext.Application.Add(app); 
    } 

dispiace di averti fatto modifiche al domanda, non sono sicuro di cosa dovrei avere? nel Compito

+0

quello che dovrebbe il vostro 'Task ' tornare? –

+0

@ Philippe Paré mi dispiace apportare modifiche al Codice, non ho alcun tipo di reso è nullo. – Alma

+2

Quindi restituire 'Task' invece :) –

risposta

10

Se non si vuole tornare nulla allora il tipo di ritorno dovrebbe essere Task.

[HttpPost] 
[Route("AddApp")] 
public async Task AddApp([FromBody]Application app) 
{ 
    // When you mark a method with "async" keyword then: 
    // - you should use the "await" keyword as well; otherwise, compiler warning occurs 
    // - the real return type will be: 
    // -- "void" in case of "Task" 
    // -- "T" in case of "Task<T>" 
    await loansRepository.InsertApplication(app); 
} 

public Task InsertApplication(Application app) 
{ 
    this.loansContext.Application.Add(app); 

    // Without "async" keyword you should return a Task instance. 
    // You can use this below if no Task is created inside this method. 
    return Task.FromResult(0); 
} 
-4

Il compilatore avviserà "Dichiarazione di ritorno mancante". Si prega di modificare il codice per:

[HttpPost] 
[Route("AddApp")] 
public void AddApp([FromBody]Application app) 
{ 
    //add configureAwait(false) as it would give better performance. 

    loansRepository.InsertApplication(app)  
} 
+0

Questo è non una risposta alla sua domanda, ma un commento. Si prega di non utilizzare la sezione risposte per questo. –

+1

E il tuo commento su ConfigureAwait è completamente disattivato. Si prega di leggere un po 'su cosa effettivamente fa e perché lo usereste. –

+0

L'uso di 'async/await' aggiunge ulteriore overhead inutile senza motivo. Considera di ritornare direttamente al risultato di 'Task.Run'. – Aron

5

Dal momento che "non può" cambiare il repository Entity Framework, non si dovrebbe fare il vostro metodo di azione asincrona, e si deve solo tornare void:

[HttpPost] 
[Route("AddApp")] 
public void AddApp([FromBody]Application app) 
{   
    loansRepository.InsertApplication(app); 
} 
+2

Stephen è l'autorità su tutte le cose asincrone - vorrei andare con la sua risposta. –

+0

Come chiameresti questo metodo da un client C#? –

+0

@FaithWins: dovresti postare in '/ AddApp' con l'applicazione' serializzata 'come corpo della richiesta. Se vuoi maggiori informazioni, ti consiglio di porre la tua domanda. –