2017-08-02 1 views
0

Ich habe eine Void-Funktion, die Daten in der Datenbank speichert, sobald die Daten gespeichert wurden Ich versuche, eine Funktion zu rufen, die Push-Benachrichtigungen senden soll und async ausgeführt werden soll aber es tut es nicht. Was mache ich falsch?Aufruf einer asynchronen Methode in void C#

public void Save(MyModel m) 
    { 
     using (var conn = Databases.DB) 
     { 
      var d = new DynamicParameters(new 
      { 
       m.Name 
      }); 

      conn.Execute("INTRANET__CreateTicket", d, commandType: CommandType.StoredProcedure); 

      //send push notifications 
      Task.Run(() => SendRaisedTicketNotifications(m)); 

     } 
    } 

    private async void SendRaisedTicketNotifications(NewAmbercatTicketView t) 
    { 
     await Task.Run(() => 
     { 
      //Send push notifications 
      var sub = new Subscritption(); 

      var people = UserRepository.List(); 
      foreach (var person in people) 
      foreach (var sub in UserPushRepository.List().Where(x => x.PersonId == person.PersonId && x.Subscribed)) 
      { 
       var notification = new PushNotification("Some content") 
       notification.SendPushNotification(sub); 
      } 
     }); 
    } 
+0

'async void' ist eine schlechte Übung. Verwenden Sie 'async Task' anstelle von –

+2

' Task.Run', der zweimal erscheint, sollte bereits Alarmglocken läuten. Ich frage mich auch, warum 'SendRaisedTicketNotifications' nicht von seinem Parameter abhängig zu sein scheint. –

+1

Was willst du eigentlich hier? Versuchen Sie nur, die Methode synchron aufzurufen oder möchten Sie sie als Hintergrundaufgabe ausführen? Ich bin mir nicht sicher, ob Sie wissen, was Async eigentlich bedeutet. – DavidG

Antwort

-2

Versuchen Sie dies Ihre Benachrichtigungen zu senden:

Task.Run(() => SendRaisedTicketNotifications(m)).Wait(); 
+1

Dies wird nicht async ausgeführt, sondern blockiert den Thread, bis die Aufgabe abgeschlossen ist. – Adwaenyth

+0

nein dies kann zu einem Deadlock führen –

+0

Aber er fragte, wie man eine asynchrone Methode innerhalb void aufrufen. Und das ist der einzige Weg, wie ich weiß ... –

0

Wie nicht Task.Run verwenden wird von Stephen Cleary recht ausführlich in seiner blog bedeckt.

Da Sie nicht auf das Beenden des asynchronen Callbacks warten möchten, könnten Sie natürlich einfach einen anderen Thread starten und Task.Run insgesamt vergessen, da Sie die Task sowieso nicht praktisch nutzen.

public void Save(MyModel m) 
{ 
    using (var conn = Databases.DB) 
    { 
     var d = new DynamicParameters(new 
     { 
      m.Name 
     }); 

     conn.Execute("INTRANET__CreateTicket", d, commandType: CommandType.StoredProcedure); 

     //send push notifications in BackgroundThread 
     Thread sendInBackground = new Thread(new ParametrizedThreadStart(SendRaisedTicketNotifications)); 
     sendInBackground.IsBackground = true; 
     sendInBackground.Start(m); 

    } 
} 

private void SendRaisedTicketNotifications(NewAmbercatTicketView t) 
{ 
    //Send push notifications 
    var sub = new Subscritption(); 

    var people = UserRepository.List(); 
    foreach (var person in people) 
    foreach (var sub in UserPushRepository.List().Where(x => x.PersonId == person.PersonId && x.Subscribed)) 
    { 
     var notification = new PushNotification("Some content") 
     notification.SendPushNotification(sub); 
    } 
} 
Verwandte Themen