Как вызвать функцию из контроллера, которая работает в фоновом режиме - PullRequest
0 голосов
/ 04 декабря 2018

поэтому у меня есть этот функциональный контроллер, в котором я создаю Пользователей после того, как Пользователи созданы Массовым, я хочу отправить SMS / подтверждение по электронной почте.Но процесс электронной почты смс делает его медленным.(так как я использую третье лицо для отправки смс, я не могу делать массовые смс). Поэтому я хочу, чтобы после создания пользователей он возвращал пользовательский интерфейс (модель), но все же другой поток работает над отправкой функции смс / электронной почты.,Пожалуйста помоги.Большое спасибо

Например:

public async Task<AjaxReturn> ImportUsers(Users[] users)
{
  //there are lot of checks here which i have removed for showing 
  //save all the users at a time 
  var saved = await _accserver.SaveBulkUser(applicationUsers, userInfo.AccountId);

  //this below method i want to call but dont want to wait till its finish,
  // I want it to continue sending sms/emails
  SendUserConfirmation(goesAllsavedUsersHere);

  return AjaxReturnHelper.GetAjaxReturn(!isAllSaved) ? ResultTypes.Error : ResultTypes.Success);
}

private async void SendUserConfirmation(UsersListhere)
{
  foreach(var user in userlist)
  {
    await _messageservice.sendsms(.....);

    await _messageservice.sendemail(.....);
  }
}

1 Ответ

0 голосов
/ 04 декабря 2018

У меня есть несколько предложений:

Не используйте async void, вы должны использовать async Task.

Измените foreach(var user in userlist) на Parallel.ForEach(...), потому что эти вызовы могут быть асинхронными

Используйте функцию обратного вызова и отправьте уведомление через SignalR в WebUI, затем отобразите сообщение

public async Task<AjaxReturn> ImportUsers(Users[] users)
{
    //there are lot of checks here which i have removed for showing 
    //save all the users at a time 
    var saved = await _accserver.SaveBulkUser(applicationUsers, userInfo.AccountId);

    //this below method i want to call but dont want to wait till its finish,
    // I want it to continue sending sms/emails
    SendUserConfirmation(goesAllsavedUsersHere, () =>
    {
        // do something here
        // you can try to call a SignalR request to UI and UI shows a message
    });

    return AjaxReturnHelper.GetAjaxReturn(!isAllSaved) ? ResultTypes.Error : ResultTypes.Success);
}

private async Task SendUserConfirmation(UsersListhere, Action doSomethingsAfterSendUserConfirmation)
{
    Parallel.ForEach(userlist, async (user) =>
    {
        await _messageservice.sendsms(.....);

        await _messageservice.sendemail(.....);
    });

    doSomethingsAfterSendUserConfirmation();
}
...