我得到一個XML提要,並將其解析爲我的MQ服務器,然後我有一個服務來監聽MQ服務器並閱讀其所有消息。在foreach循環中打開線程
我打開一個新的線程每次迭代中,爲了使解析更快foreach循環,原因有在MQ大約500消息(意味着有500個XML)
foreach (System.Messaging.Message m in msgs)
{
byte[] bytes = new byte[m.BodyStream.Length];
m.BodyStream.Read(bytes, 0, (int)m.BodyStream.Length);
System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding();
ParserClass tst = new ParserClass(ascii.GetString(bytes, 0, (int)m.BodyStream.Length));
new Thread(new ThreadStart(tst.ProcessXML)).Start();
}
在ParserClass我有這樣的代碼:
private static object thLockMe = new object();
public string xmlString { get; set; }
public ParserClass(string xmlStringObj)
{
this.xmlString = xmlStringObj;
}
public void ProcessXML()
{
lock (thLockMe)
{
XDocument reader = XDocument.Parse(xmlString);
//Some more code...
}
}
的問題是,當我運行這個foreach循環,只有1個線程,它可以完美運行,但速度緩慢。
當我用多於一個線程運行它時,出現錯誤「未將對象引用設置爲對象的實例」。
我想我的鎖定有問題,因爲我對線程不是很有經驗。
我有點無望,希望你能幫助!
乾杯!
哪一行引發異常? – Tudor 2012-01-15 20:51:55
不要啓動500個線程。 – 2012-01-15 20:54:47
購買一個500核心CPU,那麼它將100%並行,超級快速和無bug。 (換句話說,你的核心想法很可能是錯誤的,修復同步問題在一天結束時不會幫助你。) – 2012-01-15 20:57:16