2017-12-22 17 views
6

10000個のメッセージを送信する必要があります。現時点では同期的に発生し、すべてを送信するまでに最大20分かかります。 C#で非同期で5000個のメッセージを送信

// sending messages in a sync way 
foreach (var message in messages) 
{ 
    var result = Send(message); 
    _logger.Info($"Successfully sent {message.Title}.") 
} 

は、私は非同期を使用して待つしたいのですが、メッセージの送信時間を短縮するが、C#のランタイムがワーカープロセスでタスクの15000数を扱うことができれば、私の懸念があります。

var tasks = new List<Task>(); 
foreach (var message in messages) 
{ 
    tasks.Add(Task.Run(() => Send(message)) 
} 

var t = Task.WhenAll(tasks); 
t.Wait(); 
... 

また、メモリの面で、私は私が仕事から帰ってきたので、それは15000のタスク

+4

TPLはスレッドプールを使用し、 'Task.Run()'ごとに新しいスレッドを生成しません。 – Loris156

+3

ちょうどこれを実行して、それがどうなるかを確認してください – Evk

+3

sendメソッドが並行して動作できるようになると時間が短縮されます。 –

答えて

6

のリストを作成することをお勧めしますかどうかわからないんだけど、私はこれを果たしているビットとここに私の答えです。

まず第一にParallel.ForEachは非常に使いやすく、私の8コアは非常に高速です。

CPU使用率を制限して100%の容量を使用しないようにすることをお勧めしますが、それはシステムによって異なります。私は2つの提案をしました。

他のものは、送信者サーバーが問題を起こさずにこれらのすべてのジョブを食べることができることを監視し、確認する必要があります。

public void MessMessageSender(List<Message> messages) 
{ 
    try 
    { 
     var parallelOptions = new ParallelOptions(); 
     _cancelToken = new CancellationTokenSource(); 
     parallelOptions.CancellationToken = _cancelToken.Token; 
     var maxProc = System.Environment.ProcessorCount; 
     // this option use around 75% core capacity 
     parallelOptions.MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling(maxProc * 1.75)); 
     // the following option use all cores expect 1 
     //parallelOptions.MaxDegreeOfParallelism = (maxProc * 2) - 1; 
     try 
     { 
      Parallel.ForEach(messages, parallelOptions, message => 
      { 
       try 
       { 
        Send(message); 
        //_logger.Info($"Successfully sent {text.Title}."); 
       } 
       catch (Exception ex) 
       { 
        //_logger.Error($"Something went wrong {ex}."); 
       } 
      }); 
     } 
     catch (OperationCanceledException e) 
     { 
      //User has cancelled this request. 
     } 
    } 
    finally 
    { 
     //What ever dispose of clients; 
    } 
} 

私の答えは、このpageのために触発されています。ここでは

は実装です。