2017-04-14 38 views
1

AngleSharpを使用して多数のページを読み込もうとしています。考え方は、ページをロードすることであり、このページに次のページへのリンクがある場合は、次のページをロードするなど、方法は以下のように記述されます。非同期呼び出し中にAngleSharpエラーが発生しました

Specified argument was out of the range of valid values. 
Parameter name: index" 

私はThreadとsyncrhronizationに関連する何かであると考えている。しかし、私は内部例外を取得しています。あなたがアプリケーションからこれを使用している場合

public static bool ContainsNextPage(IDocument document) 
    { 
     String href = document.QuerySelectorAll(".prevnext a")[0].GetAttribute("href"); 
     if (href == String.Empty) 
      return false; 
     else 
      return true; 
    } 

    public static string GetNextPageUrl(IDocument document) 
    { 
     return document.QuerySelectorAll(".prevnext a")[0].GetAttribute("href"); 

    } 

    public static async Task<IDocument> ParseUrlSynch(string Url) 
    { 
      var config = new Configuration().WithDefaultLoader(); 
      IDocument document = await BrowsingContext.New(config).OpenAsync(Url); 

      return document; 
    } 

    public static async Task<ConcurrentBag<IDocument>> GetAllPagesDOMs(IDocument initialDocument) 
    { 

     ConcurrentBag< IDocument> AllPagesDOM = new ConcurrentBag< IDocument>(); 
     IDocument nextPageDOM; 
     IDocument currentDocument = initialDocument; 

     if (initialDocument != null) 
     { 
      AllPagesDOM.Add(initialDocument); 
     } 

     while (ContainsNextPage(currentDocument)) 
     { 
      String nextPageUrl = GetNextPageUrl(currentDocument); 

      nextPageDOM = ParseUrlSynch(nextPageUrl).Result; 
      if (nextPageDOM != null) 
       AllPagesDOM.Add(nextPageDOM); 

      currentDocument = nextPageDOM; 
     } 

     return AllPagesDOM; 
    } 

     static void Main(string[] args) 
    { 



     List<IDocument> allPageDOMs = new List<IDocument>(); 
     IDocument initialDocument = ParseUrlSynch(InitialUrl).Result; 
     List<String> urls = new List<string>(); 
     List<Subject> subjects = new List<Subject>(); 
     IHtmlCollection<IElement> subjectAnchors = initialDocument.QuerySelectorAll(".course_title a"); 

     String[] TitleAndCode; 
     String Title; 
     String Code; 
     String Description; 
     IDocument currentDocument = initialDocument; 


     ConcurrentBag<IDocument> documents =   

     GetAllPagesDOMs(initialDocument).Result; //Exception in here 
     ... 
} 

答えて

0

エラーメッセージは、このコードによって引き起こされます。たぶんそれは最初のページ、おそらく最後のどちらかの長さの配列をチェックする必要があります。

また、非同期メソッドの呼び出しをブロックすることは悪い習慣であり、避けるべきです。任意のUIアプリケーションでデッドロックが発生します。あなたが今それを取得していない唯一の理由は、あなたがコンソールアプリに入っているということです。

0

あなたの本能は、正しいデフォルト以外のあなたは、あなたが同期的にブロックされているため、デッドロックを持っていますSynchronizationContextなWPF、ウィンフォーム、またはASP.NETなどasyncTask関数を返す(これは悪いので避けてください)。最初のawaitがブロッキングコールの内部に到達すると、ブロッキングコールによって既にロックされている現在のSyncronizationContextに継続をポストしようとします(.ConfigureAwait(false)を使用する場合、この場合はハックです)。

クイックフィックスを変更することにより、介してすべての方法非同期(async)を使用することです

nextPageDOM = ParseUrlSynch(nextPageUrl).Result; 

で:

nextPageDOM = await ParseUrlSynch(nextPageUrl); 

あなたはこれで数回刺さを取得した後、あなたが学びますあなたが非同期メソッドをブロックするたびに、あなたの頭の中で警鐘が出るようにしましょう。あなたの文書の

document.QuerySelectorAll(".prevnext a")[0] 

一つprevnext内部の任意のアンカーを持っていません。

関連する問題