Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-带WebClient的多线程_C#_Multithreading_Web - Fatal编程技术网

C#-带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 +

我想问一下,是否可以使用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 + "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谢谢,我将尝试:)如果您可以实现它,它将起作用,我已经做了数百次了。