2009-10-22 48 views
2

以前我發佈了一個關於多線程的問題。其實我的意圖是通過使用c#和asp.net應用程序,在相同的時間點(例如:凌晨12:00)發送1000個(或更多)人的短信。可以選擇多線程概念來實現這一點嗎?在相同的時間點發短信

回答

6

這一概念並不需要多線程...

這個概念更多的是一種任務管理器/定時任務

  1. 創建一個ASPX的腳本看到的時間和執行需要
  2. 方法
  3. 將任務管理器設置爲每xx分鐘運行一次該腳本
  4. 創建一個方法,該方法獲取人員列表並通過SMS API發送SMS,然後調用它,例如, SendSMSFromList(名單usersList,字符串消息){}
  5. 現在設置好一切,你將運行這個任何時候你需要(只是把它在ASPX腳本)

請下跌自由地告訴我,如果你需要任何代碼。


具有所有編輯步驟


如果你有一個託管解決方案,在您的主機控制面板,你有什麼作爲任務計劃,你可以設置運行腳本每隔n分鐘一頁,如果是這樣請通過下一步操作。另一方面,如果您正在運行自己的服務器(IIS),請先執行此操作。

  • this location安裝Windows捲曲和添加curl.exe到C:\ WINDOWS
  • 打開任務管理器(控制面板 - >管理工具> Win7上任務計劃程序)
  • 創建新任務like this
  • 執行命令

捲曲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 } 
} 

做...

我只在一個文件中所做一切爲了舉例起見,你要分東西。 ..但是我之後是向你展示它的原理。

+0

或者使用http://quartznet.sourceforge.net/ Quartz.net如果調度需求更復雜 – fvu 2009-10-22 10:07:58

+0

雅謝謝你,我會按照這樣做。如果我們每10秒調用一次數據庫或者在一段時間內調用數據庫,那麼它是否可以正常工作? – Nagu 2009-10-22 10:21:30

+0

@fvu很好的開源應用程序,我需要看到這個:)我使用任務管理器捲曲:D – balexandre 2009-10-22 10:25:32

1

我不認爲這會爲你工作,並不建議創建如此大量的線程。

而且,看到這個鏈接

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

是否SMS應用程序允許發送到多少?或者,也可以在不同的盒子上使用不同的服務來發送這些短信子集。但我認爲立即發送這樣的音量將是困難的。

+0

所以你能告訴我什麼是我的問題的解決方案?有沒有其他的替代方法來實現? – Nagu 2009-10-22 09:51:19

2

取決於SMS如何實際發送。如果您讓我們說一個發送短信的Web服務,您最終將在一個點上查詢1000次,這無法解決您的問題。

要做到這一點,您需要確保發送任務可以同時完成。

編輯:
此外,我同意你的系統根本不會對你的系統健康。

編輯2: 這需要多大?假設hh:mm就足夠了,你可以用60秒發送 約1000秒。這意味着您需要每秒發送aprox 17 SMS。如果你分享 這可以說4線程,那麼你只需要確保你的發送過程/ 設備可以發送4 SMS/s。我猜這應該是可以實現的。

HTH

+0

哦,如果我發送的時間將會變得不一樣。我的意圖是同時發送它。 – Nagu 2009-10-22 09:52:30

+1

@Nagu我不知道如何在SMS消息上顯示什麼時間:消息的「接收」時間或發送者「發送」時間。不知何故,我認爲這是第二選擇,在這種情況下,所有消息都在同一時刻發送並不重要(手機時間同步)。另一方面,如果你的SMS服務提供商允許你傳送一個接收者列表,它仍然不能保證單獨的發送時間,因爲提供者應該使用短信網關的(消息接收器)數量或某物( - 。你必須期望那裏在第一個和最後一個消息之間會有一些時間間隔(微秒) – Audrius 2009-10-22 11:07:36

2

我不知道你是怎麼給他們發短信的。但幾乎所有的大型短信服務提供商都會允許您在1秒內發送1000次。
所以,除非你真的很真的真的很真的需要一次發送它們,我建議你做一個循環,並將信息發送給服務提供商。

0

我懷疑你會遇到一些運輸問題,假設這是一個實時的過程,那麼在那個時候你的SMS提供商會獲得那麼多的數據。

我會找到一個提供者能夠進行計劃發送,然後排隊在休息時間12點發送消息。