如何创建一个必须调用每次阻塞的DLL的多线程应用程序

时间:2012-04-26 21:21:51

标签: c# .net multithreading parallel-processing

我注意到即使我将更多线程用于工作,我的多线程应用程序也几乎没有获得60%的处理使用率。我检查代码,最后发现可能是对DLL(Html Agility Pack)的调用不是异步执行的。有没有办法并行调用?

2 个答案:

答案 0 :(得分:0)

第一个问题是,你如何管理线程?我通过使用托管的ThreadPools获得了很好的体验。系统自己管理它的资源。

Sewcond我建议您使用Delegates进行调用方法或DLLs Threadsave和async。关于线程池有一个很好的MSDN文章: http://msdn.microsoft.com/en-us/library/3dasc8as%28v=vs.80%29.aspx

在这里你可以找到一些关于它的好的Ressource文章: http://support.microsoft.com/kb/315582/en-us

如果这不能解决您的问题,请反馈一些代码示例。

答案 1 :(得分:0)

@Devela这不是答案。我在这里写,因为评论有点长。

我不认为您的问题与STA有关。试试下面的代码。

Action action = () =>
{
    string html = "<html><body><div>1111</div><div>222</div></body></html>";
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    var x = doc.DocumentNode.Descendants("div").ToArray();
    var y = x[0].InnerText;
};

while(true)
{
    Parallel.For(0,32,i=>action());
}

此代码使我的CPU忙碌~96%。我的猜测是你的线程被某些磁盘IO,网络操作等阻塞了。因此,当你添加更多线程时,你不会看到很多CPU使用率。