मैं अंतराल प्रक्रियाओं की कतार लोड करने की कोशिश कर रहा हूं। दूसरे शब्दों में मेरे पास एक कतार है और मैं प्रत्येक आइटम को कतार में एक व्यक्तिगत अंतराल पर चलाने के लिए चाहता हूं।नेट अधिकतम समवर्ती टाइमर धागे
मेरी समस्या यह है कि मुझे एक समय में चलाने के लिए 25 से अधिक धागे नहीं मिलते हैं। मैं 64 बिट मशीन पर .NET 4.5 का उपयोग कर रहा हूं जिसमें 32768 की डिफ़ॉल्ट अधिकतम थ्रेड गिनती है।
मैं अपनी मशीन को संभाल सकता हूं क्योंकि मेरे ऐप को कई समवर्ती धागे कैसे चला सकते हैं?
class Program
{
static void Main(string[] args)
{
System.Threading.ThreadPool.SetMaxThreads(200, 200);
test t = new test();
t.LoadUrls("http://www.google.com");
while (1 == 1)
{
System.Threading.Thread.Sleep(1000);//refresh every 5 seconds
Console.WriteLine(System.Diagnostics.Process.GetCurrentProcess().Threads.Count);
}
}
public class test
{
public void LoadUrls(string url)
{
for (int i = 0; i < 100; i++)
{
System.Threading.Timer t = new System.Threading.Timer(new System.Threading.TimerCallback(RunInterval), url, 0, 1000);
Console.WriteLine("Loaded {0} feeds.", i);
}
}
private static void RunInterval(object state)
{
string url = state as string;
string data = "";
using (System.Net.WebClient cl = new System.Net.WebClient())
{
Console.WriteLine("getting data for " + url);
data = cl.DownloadString(url);
}
//do something with the data
}
}
}
इस कोड को सैद्धांतिक रूप से 2 सेकंड या तो के बाद 198 धागे चलाना चाहिए:
यहाँ कि मेरी उत्पादन कोड में वास्तविक समस्या replicates एक उदाहरण एप्लिकेशन है।
वैसे, यह मेरे प्रोटोटाइप ऐप में खूबसूरती से काम करता है; यह नोड में लिखा गया था। लेकिन, अब मैं इसे सही ढंग से सी # में काम करने के लिए नहीं मिल सकता है ...
उत्तर: समस्या कचरा संग्रहण के साथ वास्तव में था और एक ThreadPool मुद्दा बिल्कुल नहीं था, यह पूल उन सभी धागे को स्पूल करने में सक्षम है जो मैं इसे फेंक रहा हूं। यह चाल सिस्टम के एकल पैरामीटर कन्स्ट्रक्टर का उपयोग करना है। थ्रेडिंग। टिमर; यह टाइमर को स्वयं को सैमफोर के रूप में उपयोग करेगा, इस प्रकार जीसी से परहेज करेगा।
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
test t = new test();
t.url = "http://www.google.com?" + i;
System.Threading.Timer ti = new System.Threading.Timer(new System.Threading.TimerCallback(t.RunInterval));
ti.Change(0, 1000);
}
while (1 == 1)
System.Threading.Thread.Sleep(int.MaxValue);
}
public class test
{
public string url { get; set; }
public void RunInterval(object state)
{
Console.WriteLine("getting data for " + this.url);
string data = "";
using (System.Net.WebClient cl = new System.Net.WebClient())
{
data = cl.DownloadString(this.url);
}
}
}
}
मैं क्यों तुम कभी चाहेगा एक टाइमर जीसी द्वारा एकत्र किया जा करने के लिए सुनिश्चित करने के लिए नहीं कर रहा हूँ, लेकिन हे मैं जानता हूँ कि क्या करते हैं।
में क्यों आप चाहते हैं तो कई सूत्र एक ही समय में चल रहे कार्य करें: यहाँ लिंक है? –
यह एक मतदान सेवा के लिए है। इसे निर्दिष्ट अंतराल पर एन फीड्स को मतदान करना होगा। मैं एक फैंसी कतार प्रणाली बना सकता हूं और एन व्यक्तिगत सेवाओं को चला सकता हूं जो प्रति सेवा केवल 1 फीड मतदान करते हैं। लेकिन, मैं यह मेटा बनाना चाहता हूं; मैं कार्यक्रम को प्रत्येक व्यक्तिगत प्रक्रिया शुरू करना चाहता हूं। – Eulalie367