2011-11-10 12 views
0

私は、人々が販売するものを置くサイトを持っています。 毎月、何か売り物を持っているすべてのユーザーは、Windowsサービスから、そのアイテムが売れたかどうかを尋ねる電子メールを送信し、クリックするカスタムリンクを与えます(これは、販売されているサイトに残るアイテム)。ループせずに何千もの個別のメールを送信する

まず、すべての未販売アイテムと関連ユーザーのメールを取得するためにクエリを実行する必要があります。 現在、私はこれらのすべてをループしており、各自のカスタムメールを生成し、個々のメールとして送信しています。

foreach (Item unsoldItem in unsoldItemsCollection) 
     { 
      //generate email 

      string email = GenerateUnsoldEmail(itemName, itemPrice); 
      Utils.Sendemail(unsoldItem .UserEmail, "[email protected]", "Unsold Item", email); 

     } 

(これは擬似コードの一種であるが、これは私がやっているほとんどである)

私の問題は、(それが離陸する場合:)何百万人も多分、)おそらく数千人があるかもしれないですがそのループ内のアイテムはすべて電子メールを必要としますが、これは問題を引き起こすと思います。

これ以外の方法は何ですか?

Bexの

+1

どのような問題がありますか? これは、何らかのサービスとして実行する必要があります。そのため、多くの時間がかかると、メインサイトの実行に害を与えません。 – ElDog

+0

私は間違いだと思うかもしれませんが、何百万ものアイテムを連続的にループしていて、それぞれ時間がかからずサーバーメモリを使い果たしてしまうのであれば、私は考えていますか? 私はたぶん何らかの差し込みを考えていました。わかりません。 – Bex

+1

あなたのループは問題ありません。一般的には、***は現在作業中のシンプルなものを得ることができます***。何が起きるのか心配します。何百万人ものユーザーがいる場合は、問題を解決するための良いチームを用意する余裕があります。 –

答えて

0

あなたは、コレクション内のすべてのアイテムのために何かをしたい場合は、あなたが(再帰のような、または同等のもの)ループのいくつかの種類を使用する必要があります。その周りに方法はありません。

潜在的な問題については心配する必要はありません。このコードがパフォーマンス上の問題と思われる場合は、そのコードを測定し、実際の速度と処理する電子メールの数を確認してください。

すべてのメールを送信するには数時間かかることがありますか?それは実際に問題ですか?どうして?

また、あまりにも多くのメモリが必要になると心配です。一度にすべてのアイテムをメモリにまとめることができない場合は、一度に1000を取得して処理してから別の1000を取得してください。

+0

私はいつもstackoverflow上の誰かに頼ることができます私の問題を視点に置く..これは良いアドバイスであり、最高の計画のように聞こえる! ありがとう – Bex

2

現在の電子メールが送信されるまでプログラムが停止されないように、私は非同期的にこれを行うだろう。

すべてのメールが異なるため、差し込み印刷はできません。電子メールの本文にユーザーが強制的にログインするような種類のランディングページがある場合を除いて、ユーザーのすべてのアイテムがリストされている特定のページにユーザーをリダイレクトして、尋ねられない限り既に販売されているものを取り除く。その場合、数千ではなく電子メールを送信することができます。

SmtpClient has an async version of the Send method

0

Windowsサービスを作成して送信しますすべてのあなたの電子メールを1日1回。

さらに単純なコンソールユーティリティを作成して、それを実行してスケジュールされたタスクとして実行することもできます。

関連する問題