重定向到其他ASPX页面,并在后台运行下一个代码(.NET 4.5.2)



我正在处理ASP.NET WebForm项目(旧版代码(。

 var customerSMS = BusinessLayer.SMS.SmsSetup.GetAllCustomerSMS(OfficeId);

这需要15seconds进行所有计算并获取数据(1000ROWS(

从db.和它通过循环运行并进行验证的每个数据和

发送SMS,确实需要时间。我想在后台完成此任务,

将用户重定向到索引页面,而背景过程将继续

离开循环。我是新手,仍然学习这个美丽的

语言c#。我确实经历了这种惊人的异步编程async/等待

和多线程方法,仅在简单的Windowsform

中掌握了它

应用程序。任何参考/代码段/最佳方法,对我的情况进行简单的解释会有所帮助。

我的按钮单击事件代码

    protected void ReturntoDashboard_Click(object sender, EventArgs e)
    { 
         sms = Everest.Net.BusinessLayer.SMS.SmsSetup.GetSmsSetUp(OfficeId);
         if (sms.EnableSmsData && sms.SmsCount > 0)
         {
         #region Loan Section
           var smsLoan = Everest.Net.BusinessLayer.SMS.SmsSetup.GetLoanId(s.Sms_AccountNumber);
          var loanId =
             BusinessLayer.SMS.SmsSetup.GetLoanIdValue(s.Sms_AccountNumber);
             var dateexceeded =
             BusinessLayer.SMS.SmsSetup.IsDateExceeded(loanId);
             if (smsLoan != null && dateexceeded == true)
                 {
                  foreach (Common.SMS.SMSSetup sm in smsLoan)
                    {           
                        var smsClosingBalanceLoan = BusinessLayer.SMS.SmsSetup.GetAmountForLoanAlert(  sm.LoanId,
                                                                BusinessLayer.Core.DateConversion
                                                                    .GetCurrentServerDate()
                                                                    .AddDays(sms.DaysbeforeLoanalerts).ToString());
                   if (smsClosingBalanceLoan != null)
                       {
                         if (smsClosingBalanceLoan.LoanAmountToPay > 0)
                           {
                             int smsSentAlertCount = sms.LoanAlertCount;
                                var logCount = BusinessLayer.SMS.SmsSetup.GetLoanSmsAlertSentCount(DateTime.Now.AddDays(-smsSentAlertCount).ToString("yyyy-MM-dd"), DateTime.Now.ToString("yyyy-MM-dd"), sm.LoanAccountNumber);
                                  if (logCount < smsSentAlertCount)
                                     {
                                      smsLog = new Everest.Net.Common.SMS.SMSSetup();
                                          finalMessage = "Dear Member, Your Loan accnt " + sm.LoanAccountNumber + " with Principal"+ "+" + "Int Amnt: Rs." + smsClosingBalanceLoan.LoanAmountToPay + " need to be payed.Thank You," + officeName.OfficeName;
                                             smsLog.LogServiceType = "Loan";
                                             smsLog.LogSmsType = s.Sms_SmsType;
                                             smsLog.LogSmsMessage = finalMessage;
                                             smsLog.LogCustomerId = s.CustomerId.ToString();
                                             smsLog.LogAccountNumber = s.Sms_AccountNumber;
                                             smsLog.LogAccountType = s.Sms_AccountType;
                                             smsLog.LogSmsSentDate = BusinessLayer.Core.DateConversion.GetCurrentServerDate();
                                             smsLog.LogSmsFailedDate = "";
                                             smsLog.LogSentStatus = true;
                                             smsLog.LogUserId = UserId;
                                             smsLog.LogSmsFailedMessage = "";
                                             try
                                              {
                                                 var result = Everest.Net.BusinessLayer.SMS.smsParameters.SendSMS(sms.FromNum, sms.Token, sms.Url, cellNum, finalMessage);
                                              }
                                             catch (Exception ex)
                                              {
                                                  smsLog.LogSmsFailedDate = System.DateTime.Now.ToString("MM/dd/yyyy HHmmss");
                                                  smsLog.LogSentStatus = false;
                                                  smsLog.LogSmsFailedMessage = ex.Message;
                                                  Everest.Net.BusinessLayer.SMS.SmsSetup.InsertSMSLog(smsLog);
                                              }
                                              sms = Everest.Net.BusinessLayer.SMS.SmsSetup.GetSmsSetUp(OfficeId);
                                              sms.SmsCount = sms.SmsCount - 1;
                                              Everest.Net.BusinessLayer.SMS.SmsSetup.UpdateSmsSetup(sms);
                                              Everest.Net.BusinessLayer.SMS.SmsSetup.InsertSMSLog(smsLog);
                                        }
                                    }
                               }
                          }
                   }

             }
     }
 }
  catch (Exception ex)

理想的解决方案将消除从Web应用程序本身发送SMS的责任。取而代之的是,Web应用程序应创建一个包含消息和收件人地址的数据库记录,并且一个单独的背景作业(例如Windows服务(应对数据库进行轮询并在Neeed时发送SMS消息。就容错性和可审核性而言,这是最好的解决方案,因为有消息传递作业的永久记录,如果系统失败,可以恢复。

话虽如此,也许您不想遇到所有麻烦。如果您强烈希望直接从ASP.NET应用程序发送SMS,则需要创建Task并使用QueueBackgroundWorktem进行排队以运行。您需要对代码进行重新分配。

  1. 移动将SMS发送到单独函数中的所有逻辑,该功能接受所需的所有信息作为参数。例如,

    static void SendSMS(string[] addresses, string messagetext)
    {
        //Put your SMS code here
    }
    
  2. 当您需要调用该功能时,将其排队为背景项目

    HostingEnvironment.QueueBackgroundWorkItem(a => SendSMS(addresses, messageText)); 
    
  3. 如果您的工作者任务需要访问其自己的取消令牌(例如,如果应该循环直到取消(,则将其作为参数传递给lambda表达式。因此您可以修改原型

     static void SendSMS(string[] addresses, string messagetext, CancellationToken token)
     {
          while (!token.IsCancellationRequested) 
          {
              //Put your code here
          }
     }
    

    并通过它:

    HostingEnvironment.QueueBackgroundWorkItem(token => SendSMS(addresses, messageText, token));
    

将任务放在后台队列中确保ASP.NET跟踪线程,不会试图垃圾收集它,并在应用程序池需要关闭时正确将其关闭。

>

排队背景操作后,您的页面可以呈现为每个通常的内容,并在任务继续执行时结束HTTP响应。

相关内容

最新更新