2017-06-26 5 views
0

私はASP.NET Webフォームプロジェクト(レガシーコード)を作成中です。私のbutton_clickイベントでは、これでデータが入力されます。各データについてDb.Andから別のaspxページにリダイレクトし、次のコードをバックグラウンドで実行します(.NET 4.5.2)

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

これは、すべてのコンピューティングを行うと、データ(1000rows)を取得するために周り15secondsを取る

それがループを実行し、検証と

が送信しませんSMSとそれがtime.Iがバックグラウンドでこの作業を行うにはしたく取るんや

は、インデックスページにユーザーをリダイレクトし、バックグラウンド・プロセスがそれ

まで続きます

loop.Iから抜けるには、これに新しいですし、まだC#.Iは、この驚くべき非同期プログラミング非同期/通過したこの美しい

言語は

とマルチスレッドのアプローチを待つだけでそれを手に持って学習します簡単なWindowsForm

applications.Any参照/コードスニペット/私の場合の簡単な説明との最良のアプローチは参考になります。

マイボタンのクリックイベントコード

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) 
+1

ポストバックの代わりにAjaxコールを作成すると、リダイレクトする必要がないので、答えを待つだけです。 – hardkoded

+0

@kblok hello sir..what私が望むのは、ボタンのクリックイベントの後です。ユーザーをインデックスページにリダイレクトして、バックグラウンドで仕事を送るSMSをしたいのですが、あなたはポストバックの代わりにajaxコールを使っていました.i didnt getその部分。 – OLDMONK

答えて

2

理想的なソリューションは、Webアプリケーション自体からのSMSを送信する責任を削除します。その代わりに、Webアプリケーションはメッセージと受信者のアドレスを含むデータベースレコードを作成し、別のバックグラウンドジョブ(Windowsサービスなど)はデータベースをポーリングし、必要に応じてSMSメッセージを送信する必要があります。これは、システムに障害が発生した場合に再開できるメッセージングジョブの永続的なレコードが存在するため、フォールトトレランスと監査機能の面で最適なソリューションです。

言われているように、おそらくあなたはそのすべてのトラブルに行きたくないかもしれません。 ASP.NETアプリケーションからSMSを直接送信したいと強く感じる場合は、Taskを作成し、QueueBackgroundWorkitemを使用して実行するようにキューする必要があります。コードを少しリファクタリングする必要があります。

  1. SMSを送信するためのすべてのロジックを、パラメータとして必要なすべての情報を受け入れる別の機能に移動します。あなたの労働者のタスクは、それが想定されている場合、独自のキャンセルトークン(例えばにアクセスする必要がある場合たとえば、

    static void SendSMS(string[] addresses, string messagetext) 
    { 
        //Put your SMS code here 
    } 
    
  2. 関数を呼び出す必要があり、背景アイテム

    HostingEnvironment.QueueBackgroundWorkItem(a => SendSMS(addresses, messageText)); 
    
  3. としてそれをキューイングキャンセルされるまでループする)、引数としてラムダ式に渡されます。だから、プロトタイプ

    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応答が終了します。

+0

async/awaitを使うのと同じように、非同期のprogでこれを実行することはできません。 – OLDMONK

+0

'Async'タスクは、あなたが'待っていなければ完了することが保証されていません。しかし、あなたがタスクを待っていると、ページは処理を完了できず、開始した場所に戻ってきます。これには別の糸が必要だと思います。 –

+0

私の場合、物事はマルチスレッドが必要ですか? – OLDMONK

関連する問題