Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# 什么';使方法异步运行的最佳方法是什么?_C#_Asynchronous - Fatal编程技术网

C# 什么';使方法异步运行的最佳方法是什么?

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++) {

嗨,我是异步编程新手。如何运行CheckAvailable方法来运行async?如果可能的话,我想一次下载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);
        }
    }
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);
}
}
  • 您不希望同时下载2500页,因为这对客户端和服务器都是一个问题。相反,我增加了一个并发下载限制(默认为10)。网页将一次下载10页。(如果您运行的是超级计算机,也可以将其更改为2500:)
  • 泛型列表(我认为在您的例子中是字符串列表)在默认情况下不是线程安全的,因此您应该同步对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);
                }
            }
        }
    }
    
    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
  • 您不希望同时下载2500页,因为这对客户端和服务器都是一个问题。相反,我增加了一个并发下载限制(默认为10)。网页将一次下载10页。(如果您运行的是超级计算机,也可以将其更改为2500:)
  • 泛型列表(我认为在您的例子中是字符串列表)在默认情况下不是线程安全的,因此您应该同步对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);
                }
            }
        }
    }
    
    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或类似的东西