2017-12-20 3 views
1

Ich bin ziemlich verwirrt als auch welche Methode wird die beste Lösung für mich sein.Beste Lösung zum Ausführen einer asynchronen Methode in Asp.Net MVC Controller?

Ich habe einen Controller, der eine Methode ‚PostEventEmailMessage‘ und innerhalb der Methode ruft nenne ich

// do some work 
var queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName); 
var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail); 
queueClient.CloseAsync(); 
// do remaining work 

, wo ich wirklich bin verwirrt ist, die unter Methode die beste ist, um es synchron laufen zu lassen, oder wenn es eine bessere Lösung alle zusammen in Asp.Net MVC? Es scheint, als ob die ersten beiden Optionen Deadlock-Probleme haben, entsprechend den Links, die ich verweise.

Calling async method synchronously

How would I run an async Task<T> method synchronously?

Sollte ich 1.

var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail).GetAwaiter().GetResult(); 

2.

var sequenceToCancel = queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail).Result; 

3.

var sequenceToCancel = Task.Run(() => queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail)).Result; 

mein Controller sieht so etwas wie dieses

public ActionResult SaveSpaceEvent(Details details) { 
    _spaceservice.SaveSpaceEvent(details); 
} 

dann die 'SaveSpaceEvent' Verfahren wie dieses

public void SaveSpaceEvent(Details, details) { 
    // do some stuff 
    _messageService.PostEventEmailMessage(details) 
    // do more stuff 
} 

und die Asynchron-Warteschlange Nachricht wird genannt in ‚PostEventEmailMessage sieht '

+0

Sie lesen sollten [Stephen Cleary Blog] (https://blog.stephencleary.com/); o) –

+0

können Sie einen bestimmten Beitrag empfehlen er gemacht, es gibt viele! – user1186050

+0

Alle asynchronen Blogartikel sind lesenswert, aber Sie können mit [Nicht bei Async-Code blockieren] beginnen (https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html) erste –

Antwort

1

Warum möchten Sie diese Methode jemals synchron aufrufen? schlau? Machen Sie Ihre Controller-Aktion async und Call-Methode mit await:

public async Task<ActionResult> SomeAction() 
{ 
    // ... 
    var sequenceToCancel = await queueClient.ScheduleMessageAsync(message, postEventTimeToSendEmail); 
    // ... 
} 
+0

hallo CodeFuller. Ich weiß nicht, ob das Sinn macht, aber ich muss dem Benutzer mit einer Nachricht in einem modalen Fenster antworten. Ich kann nicht antworten, bis alles fertig ist! oder ich sollte sagen, dass ich abhängig vom Ergebnis mit einem Erfolg oder einem Fehler reagieren kann. – user1186050

+1

Nicht sicher, wie sich dies auf meine Antwort bezieht. Die asynchrone Aktion ändert das funktionale Verhalten nicht. Wenn 'wait' aufgerufen wird, wird der Fluss nicht fortgesetzt, bis der erwartete Vorgang abgeschlossen ist. – CodeFuller

+0

Ausnahmebedingung mit Ihrem Beispiel ausgelöst "System.InvalidOperationException: Eine asynchrone Operation kann derzeit nicht gestartet werden. Asynchrone Operationen können nur innerhalb eines asynchronen Handlers oder Moduls oder während bestimmter Ereignisse im Page-Lebenszyklus gestartet werden. Wenn diese Ausnahmebedingung während der Ausführung einer Page auftritt Stellen Sie sicher, dass die Seite als <% @ Page Async = "true"%> markiert ist. Diese Ausnahme kann auch auf einen Versuch hinweisen, eine async void -Methode aufzurufen, die in der ASP.NET-Anforderungsverarbeitung im Allgemeinen nicht unterstützt wird Methode sollte eine Aufgabe zurückgeben, und der Aufrufer sollte darauf warten." – user1186050

Verwandte Themen