Restituzione di Void nel metodo Async da WEB API Controller

Ho questo metodo async all’interno di ASP.NET MVC 4 WEB API Controller che ho preso da questo blog: http://www.strathweb.com/2012/04/html5-drag-and-drop-asynchronous-multi-file-upload -con-asp-net-WebAPI /

public async Task<IList> Post() { List result = new List(); if (Request.Content.IsMimeMultipartContent()) { try { MultipartFormDataStreamProvider stream = new MultipartFormDataStreamProvider(HostingEnvironment.MapPath("~/USER-UPLOADS")); IEnumerable bodyparts = await Request.Content.ReadAsMultipartAsync(stream); IDictionary bodyPartFiles = stream.BodyPartFileNames; IList newFiles = new List(); foreach (var item in bodyPartFiles) { var newName = string.Empty; var file = new FileInfo(item.Value); if (item.Key.Contains("\"")) newName = Path.Combine(file.Directory.ToString(), item.Key.Substring(1, item.Key.Length - 2)); else newName = Path.Combine(file.Directory.ToString(), item.Key); File.Move(file.FullName, newName); newFiles.Add(newName); } var uploadedFiles = newFiles.Select(i => { var fi = new FileInfo(i); return new RecivedFile(fi.Name, fi.FullName, fi.Length); }).ToList(); result.AddRange(uploadedFiles); } catch (Exception e) { } } return result; } 

La mia domanda è perché esattamente questo metodo ha un tipo di operazione di ritorno? Non è chiaro “dove a” o “a chi” restituisce questo compito? È come se non ci fosse nessuno che aspetta / riceve l’object restituito.

Mi chiedo quali saranno le implicazioni se rendo nulla come questo:

MODIFICARE:

Ho provato il codice qui sotto e interrompe completamente il programma. è come se il runtime perdesse il riferimento al codice, il codice stesso non finisce di funzionare.

  public async void Post() { List result = new List(); if (Request.Content.IsMimeMultipartContent()) { try { MultipartFormDataStreamProvider stream = new MultipartFormDataStreamProvider(HostingEnvironment.MapPath("~/USER-UPLOADS")); IEnumerable bodyparts = await Request.Content.ReadAsMultipartAsync(stream); IDictionary bodyPartFiles = stream.BodyPartFileNames; IList newFiles = new List(); foreach (var item in bodyPartFiles) { var newName = string.Empty; var file = new FileInfo(item.Value); if (item.Key.Contains("\"")) newName = Path.Combine(file.Directory.ToString(), item.Key.Substring(1, item.Key.Length - 2)); else newName = Path.Combine(file.Directory.ToString(), item.Key); File.Move(file.FullName, newName); newFiles.Add(newName); } } catch (Exception e) { } } } 

Il runtime ASP.NET lo attende. Potresti trovare utile questo video .

La maggior parte degli esempi per async presuppone un contesto di interfaccia utente. ASP.NET fornisce anche un contesto , ma è un contesto di “richiesta” – uno per ogni richiesta HTTP. Il mio post async / await fornisce una panoramica di questo “contesto” e le domande frequenti su async / await vanno molto più in dettaglio.

Con il tipo di reso void non aspetti che un object ritorni .. Aspetti che un’operazione finisca. Aspetti che finisca la tua attività .

Se si restituisce il valore void, verrà restituito immediatamente il messaggio di risposta “Nessun contenuto” 204 indipendentemente dallo stato di completamento dell’operazione asincrona. Questo viene fatto con l’aiuto di VoidResultConverter .

Nota: su RC, vedrai che restituisce 200 risposte “OK” ma con l’RTM, restituirà 204 la risposta “Nessun contenuto”.