प्रारंभिक स्थितिसी # थ्रॉटलिंग पाश
मैं एक .NET फ्रेमवर्क 4.0, सी #, Winform आवेदन को विकसित करने के लिए कर रहा हूँ। एप्लिकेशन ग्रिड व्यू में वेब सेवा ओपेरेशंस (और परीक्षण) सूचीबद्ध करेगा (वर्तमान में 60 डेटारो => वेब सेवाऑपरेशंस के साथ)।
उद्देश्य
मैं परीक्षण/एक बटन पर एक क्लिक के साथ इस संचालन के सभी कॉल करनी होगी । प्रत्येक ऑपरेशन एक वर्ग का एक नया उदाहरण बनाता है। इस कक्षा के भीतर, मैं WebServiceOperation async को कॉल करता हूं और परिणाम की प्रतीक्षा करता हूं। परिणाम तब मधुमक्खी मान्य है। पूरा कोड प्रतिनिधि और घटनाओं का उपयोग करके चिकनी काम करता है।
अब यह चुनौती/प्रश्न की बात आती है: जब कि बटन पर क्लिक, मैं पाश के लिए एक का उपयोग करें (int i = 0; मैं < gridViewWsOperations.RowCount; i ++) => दूसरे शब्दों के साथ, वर्तमान में मैं कर रहा हूँ उन पर 60 ऑपरेशनों को फायरिंग 'एक ही समय' => सर्वर एक ही समय में 60 अनुरोधों को अधिभारित करता है और मुझे टाइमआउट मिलते हैं। तो मुझे एक ही समय में 10 कहने के लिए समवर्ती अनुरोधों की संख्या को किसी भी तरह से थ्रॉटल करने की आवश्यकता है। विचार करें, लूप के लिए (जहां मुझे अनुरोधों को एनक्यू करना है) विधि (process_result ईवेंट) के समान थ्रेड में नहीं है जहां मैं अनुरोधों को अस्वीकार करता हूं। मैंने ConcurrentQueue का उपयोग करके इसे आजमाया क्योंकि इस प्रकार का संग्रह थ्रेड-सुरक्षित प्रतीत होता है।
लिंक
एक नमूना कोड वास्तव में मदद मिलेगी!
--- यह मेरा समाधान/नमूना कोड
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;
using System.Threading;
namespace ConcurrentQueueSample
{
class Program
{
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(3);
static void Main(string[] args)
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Interval = 1234;
timer.Enabled = true;
timer.Start();
for (int i = 0; i < 10; i++) new Thread(go).Start(i);
}
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
semaphoreSlim.Release();
}
static void go(object i)
{
Console.WriteLine("id: {0}", i);
semaphoreSlim.Wait();
Console.WriteLine("id: {0} is in", i);
Thread.Sleep(1250);
Console.WriteLine("id: {0} left!", i);
}
}
}
एक सेमफोर का उपयोग करने का प्रयास करें http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx – cadrell0
'semaphoreSlim.Release() 'टाइमर में नहीं होना चाहिए, यह होना चाहिए आखिरी चीज 'गो' में बुलाया जाता है। इसके अलावा आप एक पूर्ण थ्रेड के बजाय [थ्रेडपूल] (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx) थ्रेड का उपयोग करना चाह सकते हैं। –
आप समवर्ती अनुरोधों की संख्या को सीमित करने के लिए वेब सेवा को कॉल करने वाले वर्ग के भीतर सेमाफोर का उपयोग कर सकते हैं। – Hylaean