2017-12-22 3 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 % 용량을 사용하지 말 것을 권장하지만 시스템에 따라 다르므로 두 가지 제안을했습니다.

다른 것들은 모니터해야하며 발신자 서버가 문제를 일으키지 않고 이러한 모든 작업을 먹을 수 있어야합니다.

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에 대한 영감 : 여기

는 구현이다.