質問

以前、マルチスレッドに関する質問を投稿しました。実際、私の意図は、c#とasp.netアプリケーションを使用して、同じ時間(例:午前12:00にシャープ)に1000人(またはそれ以上)の人にSMSを送信することです。これを達成するためにマルチスレッドの概念を選択しても大丈夫ですか?

役に立ちましたか?

解決

この概念はマルチスレッドを必要としません...

その概念は、タスクマネージャー/クロンジョブに近い

  1. 時刻を確認して必要なメソッドを実行するASPXスクリプトを作成します
  2. このスクリプトをxx分ごとに実行するようにタスクマネージャーを設定します
  3. 例として、人のリストを取得し、SMS APIを介してSMSを送信するメソッドを作成し、呼び出します。 SendSMSFromList(List usersList、string message){}
  4. これですべての設定が完了し、必要なときにいつでも実行できます(ASPXスクリプトで設定するだけです)

このためのコードが必要な場合は、お気軽に教えてください。


編集済み:すべてのステップを持っている


ホストされたソリューションがある場合、ホスティングコントロールパネルには、タスクスケジュールとして何かがあり、n分ごとにスクリプトページを実行するように設定できます。 。一方、独自のサーバー(IIS)を実行している場合は、最初にこれを実行します。

  • この場所からWindows用のcUrlをインストールし、 curl.exe からC:\ WINDOWS
  • タスクマネージャーを開きます(コントロールパネル>管理ツール> win7のタスクスケジューラー)
  • 新しいタスクを作成このよう
  • コマンドを実行します
  

curl http://localhost/yourApp/taskManager.aspx

これで、ブラウザでそのリンクを実行する場合と同様に、ファイルを実行するようにシステムを構成しました。15分ごとに実行されます。

そのtaskManager.aspxファイルを作成する必要があります

public partial class taskManager : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;

        // Run after midnight
        if (dt.Hour == 0 && dt.Minute <= 15)
        {
            Write2Log("Schedule Job Started", LogType.INFO);

            SendSMSFromList(
                GetUsersList(), 
                GetSMSMessage());

            Write2Log("Schedule Job Finished", LogType.INFO);
        }
    }

    private string GetSMSMessage()
    { 
        // Fetch the text from DB...

        return "This is the message content that I will send as SMS"; 
    }

    private List<string> GetUsersList()
    { 
        // fetch the list form DB...

        return new List<string>(); 
    }

    private void SendSMSFromList(List<string> usersList, string message)
    { 
        // send SMS's
        foreach (string phoneNr in usersList)
        { 
            // send message
            mySMSAPI.Send(phoneNr, message);
        }
    }

    private void Write2Log(string text, LogType type)
    { 
        // Log to a file what's going on...
        try
        {
            string filename = HttpContext.Current.Server.MapPath("") + "\\status.log";
            using (StreamWriter sw = new StreamWriter(filename, true))  // open to append
            {
                // example: 2008-12-17 13:53:10,462 INFO - Schedule Job Finished
                string write = String.Format("{0} {1} - {2}",
                                DateTime.Now,
                                type.ToString(),
                                text);

                sw.WriteLine(write);
            }
        }
        catch (Exception)
        { }
    }

    private enum LogType
    { INFO, WARNING, ERROR }
}

完了...

例のためにすべてを1つのファイルで作成しました。分割する必要があります...しかし、私が求めていたのは、その原理を示すことでした。

他のヒント

SMSの送信方法がわかりません。ただし、ほとんどすべての大手SMSサービスプロバイダーでは、1秒以内に1000を送信できます。
したがって、一度に送信する必要がある本当に本当に本当に本当に本当にでない限り、ループを作成して、情報を一度に1つずつサービスプロバイダーに送信することをお勧めします。

SMSの実際の送信方法によって異なります。 SMSを送信するWebサービスを例にとると、ある時点で1000回クエリを実行することになり、問題は解決しません。

これを実現するには、送信タスクを同時に実行できることを確認する必要があります。

編集:
さらに、その量のスレッドはシステムにとってまったく健全ではないことに、私は同意します。

Edit2: これはどのくらいシャープにする必要がありますか? hh:mmで十分で、送信する60があると仮定します あなたの約1000のSMS。つまり、1秒あたり約17 SMSを送信する必要があります。共有する場合 これにより、4つのスレッドが可能になり、送信プロセス/ デバイスは4 SMS / sを送信できます。これは達成可能なはずです。

HTH

それがあなたのために働くとは思わないので、このような多数のスレッドを作成することはお勧めしません。

また、このリンクを参照

maximum-number-of-threads-in-a-net -app

SMSアプリケーションでは、多数送信が可能ですか?または、さまざまなボックスで異なるサービスを使用して、これらのsmsのサブセットを送信することもできます。しかし、そのようなボリュームを一度に送信するのは難しいと思います。

リアルタイムプロセスであると仮定して、その時点でSMSプロバイダーに大量のデータを送信するトランスポートの問題があると思われます。

スケジュールされた送信を実行できるプロバイダーを見つけてから、メッセージをキューに入れて午前12時に暇なときに送信します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top