2012-03-15 8 views
1

私は電子メールリストの名前をリストビューにしています(インポート時にパスと名前を追加しています)。 私は、IPアドレス、ポート、ユーザー、パス、タイプ(通常、ssl、tls)の5つの列を持つsmtpサーバーの別のリストビューを持っています。 プログレスバーのための背景作業者。電子メールを送信するためのマルチスレッド

int cnt = this.listView1.CheckedItems.Count;//email lists 
      for (int i = 0; i < cnt; i++) 
      { 
       startsend(); 
      } 

したがって、listView1の電子メールリストごとに機能を実行します。

しかし、私は20-30スレッドを使用する方法を知っているし、電子メールを送信するlistView2(checkeditems)で持っているすべてのsmtpサーバー(ランダムではない)も使用します。 私は3台のsmtpサーバーしか持っていませんが、まだ20スレッドを使いたいです。

私はこの解決策を1週間以上見つけようとしましたが、できませんでした。ここには多くの専門家がいて、n00bユーザーを助けることができます。

listView1.CheckedItemsからローテーションされたsmtpサーバーを使用し、20-30スレッドを使用して、各listView1.CheckedItemsから電子メールを送信するにはどうすればよいですか? ありがとうございました!

+2

投票:質問自体は合理的に見えながら、有効な答えが最も可能性の高い方法を大量に説明する必要が-メールを送る。より一般的な方法で答えることができるチャンクに質問を分割することを検討してください(「ランダムSMTPサーバーを選択する必要はありません」の代わりに「ランダムに1つの文字列を3つ選択する方法」)。 –

+0

ActiveTrailのようなバルク電子メールサービスを使いたいと思うようです。 – zmbq

答えて

1

まず、このタスクにはforeachを使用する必要があります。これははるかに読みやすくなっています。だから、最初にあなたが電子メールリストの上に、サーバを反復し、内部ループに並列にメールを送ることができます:閉鎖する

ThreadPool.SetMinThreads(20, 20); 
int activeWorkers = 0; 
object signal = new object(); 

foreach(/* server in listView2 */) 
{ 
    foreach(/* email in listView1 */) 
    { 
     lock(signal) ++activeWorkers; // keep track of active workers 

     ThreadPool.QueueUserWorkItem(
      o => 
      { 
       string email = (string)o; 
       startsend(server, email);     

       lock(signal) // signal termination 
       { 
        --activeWorkers; 
        Monitor.Pulse(signal);      
       } 
      }, email); 

     lock(signal) 
     { 
      while(activeWorkers > 0) // improvised barrier 
       Monitor.Wait(signal); 
     } 
    } 
} 
+0

ありがとうございました。私はこれをテストし、私はあなたのアイデアを実装することができることを願っています。 –

+0

私はあなたの関数を追加し、私は次のエラーが表示されます:クロススレッド操作が有効でない:コントロール 'listView2'は、作成されたスレッド以外のスレッドからアクセスしました。あなたは私を助けることができます? –

+0

スレッドプールから 'listView2'を修正しようとしていますか? – Tudor

関連する問題