在同一时间点发送短信

时间:2009-10-22 09:47:02

标签: c# asp.net multithreading sms

之前我发布了一个关于多线程的问题。实际上我的意图是通过使用c#和asp.net应用程序在同一时间点(例如:凌晨12:00)向1000(或更多)人发送短信。可以选择多线程概念来实现这一目标吗?

5 个答案:

答案 0 :(得分:6)

这个概念不需要多线程......

这个概念更像是一个任务管理器/ Cron工作

  1. 创建一个查看时间并执行所需方法的ASPX脚本
  2. 设置任务管理器以每隔xx分钟运行此脚本
  3. 创建一个方法,该方法可以获取人员列表并通过SMS API发送短信,并将其调用,例如。 SendSMSFromList(List usersList,string message){}
  4. 现在设置好所有内容,您可以随时运行它(只需在ASPX脚本中设置)
  5. 如果您需要任何代码,请随时告诉我。


    完成所有步骤

    已修改


    如果您有托管解决方案,则在您的主机控制面板中,您可以设置为任务计划,您可以设置为每n分钟运行一次脚本页面,如果是这样,请通过后续步骤。另一方面,如果您正在运行自己的服务器(IIS),请先执行此操作。

    • this location安装适用于Windows的cUrl,并将 curl.exe 添加到C:\ WINDOWS
    • 打开任务管理器(控制面板>管理工具> win7上的任务计划程序)
    • 创建新任务like this
    • 运行命令
      

    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 :(得分:2)

取决于实际发送短信的方式。如果您让我们说一个发送短信的网络服务,您最终会在一次查询1000次,这将无法解决您的问题。

要实现这一目标,您需要确保发送任务可以同时完成。

编辑:
此外,我同意,根据你的系统,这些线程数量不会很健康。

EDIT2: 这需要多么尖锐?假设hh:mm就够了,你可以发送60秒 你的约1000短信。这意味着您需要每秒发送aprox 17 SMS。如果你分享 这让我们说4个线程然后你只需要确保你的发送过程/ 设备可以发送4个短信/秒。这应该是可以实现的。

HTH

答案 2 :(得分:2)

我不知道你是怎么发短信的。但几乎所有大型短信服务提供商都允许您在1秒内发送1000 所以,除非你真的真的真的非常需要立即发送所有内容,我建议你做一个循环,然后将信息发送给服务提供商。

答案 3 :(得分:1)

我不认为这对你有用,并且不建议创建如此多的线程。

另请参阅此链接

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

SMS应用程序是否允许发送给多个人?或者可以在各种盒子上使用不同的服务来发送这些短信子集。但我认为一次发送这样的音量很难。

答案 4 :(得分:0)

我怀疑你会遇到一些传输问题,在那个时候假设它是一个实时的过程,会把这么多的数据提供给你的SMS提供商。

我找到一个能够进行预定发送的提供商,然后将消息排队,以便在我的闲暇时间在凌晨12点发送。