【发布时间】:2013-07-05 16:12:45
【问题描述】:
我正在使用 C# .Net4.0 在 Visual Studio 2010 中构建这个程序 目标是使用线程和队列来提高性能。
我有一个需要处理的网址列表。
string[] urls = { url1, url2, url3, etc.} //up to 50 urls
我有一个函数可以接收每个 url 并处理它们。
public void processUrl(string url) {
//some operation
}
最初,我创建了一个 for 循环来遍历每个 url。
for (i = 0; i < urls.length; i++)
processUrl(urls[i]);
该方法有效,但程序很慢,因为它一个接一个地通过 url。
所以想法是使用线程来减少时间,但我不太确定如何处理。
假设我想创建 5 个线程同时处理。
当我启动程序时,它将开始处理前 5 个 url。完成后,程序开始处理第 6 个 url;当另一个完成时,程序开始处理第 7 个 url,依此类推。
问题是,我不知道如何实际创建 url 的“队列”并能够通过队列和处理。
谁能帮我解决这个问题?
-- 下午 1:42 编辑--
我在同时运行 5 个进程时遇到了另一个问题。
processUrl 函数涉及写入日志文件。如果多个进程同时超时,它们会同时写入同一个日志文件,我认为这会引发错误。
我假设这是问题所在,因为我收到的错误消息是“该进程无法访问文件 'data.log',因为它正被另一个进程使用。”
【问题讨论】:
-
Parallel.For在您的情况下可能会更有用。请注意,拥有“更多”线程并不一定会使您的程序更快。 -
将 processUrl 重写为异步方法,等待 IO 的异步方法并并行触发您的请求。不需要明确的线程代码。
-
async , await 仅适用于 .net framework 4.5
-
@spender 会好很多,但也需要升级到 VS 2012 :(
-
@srsyogesh 您可以在 .NET 4 中使用异步目标包进行操作,但仍然需要 VS 2012,而不是 2010...
标签: c# multithreading queue