C#-带WebClient的多线程
我想问一下,是否可以使用WebClient执行多线程C#-带WebClient的多线程,c#,multithreading,web,C#,Multithreading,Web,我想问一下,是否可以使用WebClient执行多线程 Parallel.ForEach(Keywords, s => { for (int i = 0; i < Pages; i++) { string url = URLdownloader.DownloadString("https://www.bing.com/search?q=" + s + "&first=" + i +
Parallel.ForEach(Keywords, s =>
{
for (int i = 0; i < Pages; i++)
{
string url = URLdownloader.DownloadString("https://www.bing.com/search?q=" + s + "&first=" + i + "0");
MatchCollection urlCollection = Regex.Matches(url.ToString(), @"(\Whttp:\/\W[a-z./?=A-Z0-9&-]+)");
foreach (Match m in urlCollection)
{
urlsdownload.Add(m.ToString().Replace(@"""", ""));
urlsdownload = urlsdownload.Distinct().ToList();
File.WriteAllLines(
@"C:\Users\username\Desktop\DorkWorker\URLparser\Bing.txt".Replace("username",
Environment.UserName), urlsdownload);
}
}
});
Parallel.ForEach(关键字,s=>
{
对于(int i=0;i
假设我有100个URL,而不是逐个检查,怎么可能同时检查10个呢?还是5 您应该使用
DownloadStringAsync()
而不是DownloadString
:
int=0;
假设您的URL位于名为下载URL
的字符串数组中:
WebClient[] wc = new WebClient[10];
for(int i=0;i<10;i++)
{
wc[i] = new WebClient();
wc[i].DownloadStringCompleted += (s, e) =>
{
if(curDownload<DownloadUrls.Length-1)
(WebClient(s)).DownloadStringAsync(DownloadUrls[curDownload++]);
};
if(curDownload<DownloadUrls.Length-1)
wc[i].DownloadStringAsync(DownloadUrls[curDownload++]);
}
WebClient[]wc=新的WebClient[10];
对于(int i=0;i
{
如果(curdownload)您是否尝试了Parallel.ForEach()
?太多的方法,您是否真的尝试过任何方法?例如使用Task.whalll
或Parallel.ForEach
?尝试了Parallel.ForEach,但它不起作用,程序崩溃了什么是URLDownloader?无论如何,WebClient不是线程安全的()。你应该使用HttpClient,这是。@CamiloTerevinto好吧,这句话过于简化了,但当应用到原始问题时就没有了。我在多线程上使用一个实例,没有任何问题。但必须考虑到一些事情:你能解释一下它的作用吗?(s,e)让我感到困惑的是,DownloadStringAsync
在另一个线程中启动下载,只会引发事件DownloadStringCompleted
,在那里你可以开始下一次下载,因此在这里我们有10个网络客户端,每个客户端都获取一个要下载的url,例如curDownload
将是9,然后第一次下载完成ted,downloadstringcompleted该webclient的事件将触发,因此,您可以下载下一个,DownloadURL[curDownload++]
在本例中为10谢谢,我将尝试:)如果您可以实现它,它将起作用,我已经做了数百次了。