gpt4 book ai didi

c# - 使方法异步运行的最佳方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:02 25 4
gpt4 key购买 nike

大家好,我是异步编程的新手。如何运行我的方法 checkAvaible 以运行异步?如果可能的话,我想一次下载 2500 页,不要等到完成一个下载后再开始另一个。我怎样才能做到?

private static void searchForLinks()
{
string url = "http://www.xxxx.pl/xxxx/?action=xxxx&id=";


for (int i = 0; i < 2500; i++)
{
string tmp = url;
tmp += Convert.ToString(i);

checkAvaible(tmp); // this method run async, do not wait while one page is downloading
}

Console.WriteLine(listOfUrls.Count());
Console.ReadLine();
}

private static async void checkAvaible(string url)
{
using (WebClient client = new WebClient())
{
string htmlCode = client.DownloadString(url);

if (htmlCode.IndexOf("Brak takiego obiektu w naszej bazie!") == -1)
listOfUrls.Add(url);
}
}

最佳答案

  1. 您不会希望同时下载 2500 个页面,因为这对您的客户端和服务器来说都是一个问题。相反,我添加了并发下载限制(默认为 10)。网页将一次下载 10 页。 (或者,如果您运行的是 super 计算机,您可以将其更改为 2500 :))
  2. 通用列表(我认为在您的情况下它是一个字符串列表)默认情况下不是线程安全的,因此您应该同步对 Add 方法的访问。我也添加了这一点。

这是更新后的源代码,可通过可配置的并发调用量异步下载页面

private static List<string> listOfUrls = new List<string>();

private static void searchForLinks()
{
string url = "http://www.xxxx.pl/xxxx/?action=xxxx&id=";

int numberOfConcurrentDownloads = 10;

for (int i = 0; i < 2500; i += numberOfConcurrentDownloads)
{
List<Task> allDownloads = new List<Task>();
for (int j = i; j < i + numberOfConcurrentDownloads; j++)
{
string tmp = url;
tmp += Convert.ToString(i);
allDownloads.Add(checkAvaible(tmp));
}
Task.WaitAll(allDownloads.ToArray());
}

Console.WriteLine(listOfUrls.Count());
Console.ReadLine();
}

private static async Task checkAvaible(string url)
{
using (WebClient client = new WebClient())
{
string htmlCode = await client.DownloadStringTaskAsync(new Uri(url));

if (htmlCode.IndexOf("Brak takiego obiektu w naszej bazie!") == -1)
{
lock (listOfUrls)
{
listOfUrls.Add(url);
}
}
}
}

关于c# - 使方法异步运行的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33474280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com