- PR -

ASP.NET:バックグラウンドで処理をさせるには?

投稿者投稿内容
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-22 10:56
いつもお世話になっております。m(__)m

自社システムに、ASPによる「会員へのメール送信」という処理があります。
ブラウザで件名と本文を入力して送信ボタンを押すと、バックグラウンドで1000人ほどの会員へ一斉配信を開始するバッチを起動するというものです。
このバッチはVBSで書かれており、CDONTSを使ってメール送信をしていました。
また、ASPからこのVBSの起動をするには
Set wsh_obj = Server.CreateObject("WScript.Shell")
wsh_obj.Run "CScript Mailsend.vbs"
と記述していました。
今回これをWindows Server 2003のASP.NETに乗せ変えようとしています。

Windows Server 2003ではCDONTSがサポートされていないためそのままの運用ができません。
変わりになるものを作成するにもその実現方法が???という状況です。

VB.NETで、SYSTEM.Web.Mailを使って特定のテストアドレス(1宛先)にメールを送る、というものは作成できました。
でもバックグラウンドで、データベースに入っている会員データにアクセスしながら、SYSTEM.Web.Mailのクラスを使用してメールを順次送信する・・・となると、VBで「何」を「どう」作り、ASP.NETから「どう」呼び出せばよいのかが分かりません。

「非同期」「マルチスレッド」などの単語をキーワードにして調べてみたのですが今一ピンときません。
その方法、仕組みなど、参考情報がありましたら、ぜひ教えていただけないでしょうか?
よろしくお願いいたします。
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-10-23 08:58
ASP.Netでも簡単にできますよ。まずはサンプルを動かしてみましょう。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconasynchronousprogramming.asp
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-23 09:34
回答ありがとうございました。
この手のページは、初心者には結構難しいですが、慣れていかなければならないのでしょうね
(^^;)

ようはメインのASP.NETから別のプログラムを呼び出す、ということではなく
処理完了を待たないでいい処理を実行できる・・・
ということでしょうか?

ちょっとまだ理解が浅いので、よく読んでみようと思います。
あらためてご報告致します。
ありがとうございました。
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-23 13:49
上記教えていただいた非同期関連のページに目を通してみました。
たぶん、私がやりたいことの参考になるのは
「非同期呼び出し完了時のコールバック メソッドの実行」あたりだと思うのですが
たとえばASP.NETでButton1を押したらTESTmethodを起動する、とした場合
Button1_Click()の関数部分には、どこを記述したらよいのでしょうか?

サンプルを試してみようとVB.NETで、WEBアプリの作成からやってみたのですが
記述する場所がわかりませんでした。
サンプルはASP.NETではなく、VB・・・ですよね?
勉強不足な点もあるかと思いますが、いま少しよろしくお願いいたしますm(__)m
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-23 14:54
再び自己レスです。
コンソールプログラムという切り口もあるようです。
もう少し調べてみようと思います。m(__)m
ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-10-23 16:50
引用:
サンプルを試してみようとVB.NETで、WEBアプリの作成からやってみたのですが
記述する場所がわかりませんでした。
サンプルはASP.NETではなく、VB・・・ですよね?
勉強不足な点もあるかと思いますが、いま少しよろしくお願いいたしますm(__)m

非同期デリゲートの考え方はWinフォームでもWebフォームでも同じです。

Execボタンで非同期処理を開始し、Refreshボタンで処理状態を確認するだけのサンプルです。
とりあえずブレークポイントはって動作を確認してみてください。
コード:
<asp:TextBox id="TextBox1" runat="server">10000</asp:TextBox>
<asp:Button id="Button1" runat="server" Text="Exec"></asp:Button>
<asp:Button id="Button2" runat="server" Text="Refresh"></asp:Button>
<asp:Label id="Label1" runat="server"></asp:Label>

public class Async : System.Web.UI.Page
{
  protected System.Web.UI.WebControls.TextBox TextBox1;
  protected System.Web.UI.WebControls.Label Label1;
  protected System.Web.UI.WebControls.Button Button1;
  protected System.Web.UI.WebControls.Button Button2;
  
  public delegate string ExecDelegate(int duration);
  
  private void Page_Load(object sender, System.EventArgs e)
  {
    if(!IsPostBack)
    {
      Session["state"] = "未処理";
      Label1.Text = Session["state"].ToString();
    }
  }

  private void Button1_Click(object sender, System.EventArgs e)
  {
    //処理クラス
    ExecClass objExec = new ExecClass();
    //デリゲート
    ExecDelegate dlgt = new ExecDelegate(objExec.Exec);
    //コールバックメソッド
    AsyncCallback cbm = new AsyncCallback(CallbackMethod);
    //非同期処理開始
    IAsyncResult ar = dlgt.BeginInvoke(Int32.Parse(TextBox1.Text), cbm, dlgt);
    
    Session["state"] = "処理中";
    Label1.Text = Session["state"].ToString();
  }
  //コールバックメソッド
  void CallbackMethod(IAsyncResult ar)
  {
    ExecDelegate dlgt = (ExecDelegate)ar.AsyncState;
    string ret = dlgt.EndInvoke(ar);
    
    Session["state"] = ret;
  }
  //状態チェック
  private void Button2_Click(object sender, System.EventArgs e)
  {
    Label1.Text = Session["state"].ToString();
  }
}

//非同期処理対象クラス
public class ExecClass
{
  public string Exec(int duration)
  {
    System.Threading.Thread.Sleep(duration);
    
    return "処理完了";
  }
}

ぴで
大ベテラン
会議室デビュー日: 2002/10/10
投稿数: 123
お住まい・勤務地: 東京
投稿日時: 2003-10-24 00:35
他のMLでも質問しているようですから、もういいですね。
Kirarin
会議室デビュー日: 2003/09/29
投稿数: 10
投稿日時: 2003-10-24 08:49
投稿したのはコチラが先だったのですが、返答がなかなかなかったので他の所でも聞いてしまいました。
不快に思われたら大変申し訳ありませんでしたm(__)m

今は頂いたサンプルを自分なりにVBの記述に直して(Cはやったことが無いので^^;)実行してみています。
別のMLとは解決策が違うので、どりらもやってみようと思っています。
自分の中で解決とまではまだ行っていませんが、大変参考になりました。
ご協力ありがとうございましたm(__)m

スキルアップ/キャリアアップ(JOB@IT)