如何在后台运行的Controller中调用函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在后台运行的Controller中调用函数相关的知识,希望对你有一定的参考价值。

所以我有这个功能控制器,我在批量创建用户后创建用户,我想发送短信/电子邮件确认。但电子邮件短信过程使它变慢。 (因为我正在使用第三方发送短信,我无法进行批量短信)因此我想要它,以便一旦它创建了用户它返回UI(模型),但仍然其他线程工作发送短信/电子邮件功能。请帮忙。非常感谢

例如:

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(.....);
  }
}
答案

我有一些建议:

不要使用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();
}

以上是关于如何在后台运行的Controller中调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行控制器代码后调用链接指令功能

Razor基础,视图里如何调用controller里的函数

Apache OpenWhisk操作完成后如何在后台运行代码?

当应用程序使用 react-native-background-task 在后台运行时如何调用函数?

button按钮如何在onclick中调用java后台函数

如何在python中创建一个在间隔函数调用上线程化的后台?