2017-12-22 129 views
6

में एसिंक तरीके से 5000 संदेश भेजना मुझे 10000 संदेश भेजना है। फिलहाल, यह तुल्यकालिक रूप से होता है और उन्हें सभी भेजने के लिए 20 मिनट तक लगते हैं।सी #

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

संदेश भेजने समय को छोटा करने के लिए, मैं async का उपयोग करें और इंतजार करना चाहते हैं, लेकिन मेरी चिंता का विषय है अगर सी # क्रम वर्कर प्रोसेस में कार्यों की 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

टीपीएल एक थ्रेड पूल का उपयोग करता है और प्रत्येक 'कार्य। रुन()' के लिए एक नया धागा नहीं उड़ाएगा। – Loris156

+3

बस इसे चलाएं और देखें कि यह – Evk

+3

कैसे जाता है यदि प्रेषण विधि समानांतर में काम कर सकती है तो यह केवल समय कम करेगी। –

उत्तर

6

की एक सूची बनाने के लिए जब से मैं काम से घर आया हूँ, मैं इस के साथ खेला है थोड़ा और मेरा जवाब यहाँ है।

सबसे पहले Parallel.ForEach उपयोग करने के लिए बहुत अच्छा है, और मेरे 8 कोर रन बहुत तेज़ हैं।

मैं सीपीयू उपयोग को सीमित करने का सुझाव देता हूं ताकि आप 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 के लिए प्रेरित किया जाता है:

यहाँ एक कार्यान्वयन है।