У меня есть несколько предложений:
Не используйте 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();
}