C# 什么';使方法异步运行的最佳方法是什么?
嗨,我是异步编程新手。如何运行CheckAvailable方法来运行async?如果可能的话,我想一次下载2500页,不要等到一次下载完成后再开始另一次。我怎样才能做到C# 什么';使方法异步运行的最佳方法是什么?,c#,asynchronous,C#,Asynchronous,嗨,我是异步编程新手。如何运行CheckAvailable方法来运行async?如果可能的话,我想一次下载2500页,不要等到一次下载完成后再开始另一次。我怎样才能做到 private static void searchForLinks() { string url = "http://www.xxxx.pl/xxxx/?action=xxxx&id="; for (int i = 0; i < 2500; i++) {
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);
}
}
private static void searchForLinks()
{
字符串url=”http://www.xxxx.pl/xxxx/?action=xxxx&id=";
对于(int i=0;i<2500;i++)
{
字符串tmp=url;
tmp+=转换为字符串(i);
CheckAvailable(tmp);//此方法异步运行,下载一页时不要等待
}
Console.WriteLine(listOfUrls.Count());
Console.ReadLine();
}
私有静态异步void checkAvailable(字符串url)
{
使用(WebClient=newWebClient())
{
字符串htmlCode=client.DownloadString(url);
if(htmlCode.IndexOf(“Brak takiego obiektu w naszej bazie!”)=-1)
添加(url);
}
}
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);
}
}
}
}
private static List listOfUrls=new List();
私有静态void searchForLinks()
{
字符串url=”http://www.xxxx.pl/xxxx/?action=xxxx&id=";
int numberOfConcurrentDownloads=10;
for(int i=0;i<2500;i+=numberOfConcurrentDownloads)
{
List allDownloads=新列表();
对于(int j=i;j
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);
}
}
}
}
private static List listOfUrls=new List();
私有静态void searchForLinks()
{
字符串url=”http://www.xxxx.pl/xxxx/?action=xxxx&id=";
int numberOfConcurrentDownloads=10;
for(int i=0;i<2500;i+=numberOfConcurrentDownloads)
{
List allDownloads=新列表();
对于(int j=i;j
最好通过从内到外的方式将代码转换为async
。在此过程中遵循最佳实践,例如避免async void
,使用async
后缀,并返回结果而不是修改共享变量:
private static async Task<string> checkAvaibleAsync(string url)
{
using (var client = new HttpClient())
{
string htmlCode = await client.GetStringAsync(url);
if (htmlCode.IndexOf("Brak takiego obiektu w naszej bazie!") == -1)
return url;
else
return null;
}
}
最好从内部开始,然后从外部开始,将代码转换为
async
。在此过程中遵循最佳实践,例如避免async void
,使用async
后缀,并返回结果而不是修改共享变量:
private static async Task<string> checkAvaibleAsync(string url)
{
using (var client = new HttpClient())
{
string htmlCode = await client.GetStringAsync(url);
if (htmlCode.IndexOf("Brak takiego obiektu w naszej bazie!") == -1)
return url;
else
return null;
}
}
这两个方法都是同步的,尽管您已将其标记为
async
确定我已从方法searchforlinks中编辑并删除async方法返回async void
的唯一时间是GUI事件处理程序<代码>检查可用性仍然是同步的。同时下载2500在您自己的机器上或您正在下载的服务器上都不好。您应该使用类似PLINQ或类似的工具。此外,如果您设法“同时”运行这些工具,这意味着多线程,而不仅仅是异步的,除非列表是线程安全的,否则拥有一个共享的listofulls
可能意味着灾难。尽管您已将其标记为async
Ok,但您的两个方法都是同步的。我已编辑并删除了方法searchforlinks中的async。方法返回async void
的唯一时间是GUI事件处理程序<代码>检查可用性仍然是同步的。同时下载2500在您自己的机器上或您正在下载的服务器上都不好。你应该使用类似PLINQ或类似的东西