StaTaskScheduler (расширение TPL) и WPF Control WebBrowser - неправильная тема - PullRequest
1 голос
/ 12 августа 2011

Я хочу загрузить веб-сайт с помощью элемента управления WebBrowser (WPF) в фоновом режиме и впоследствии выполнить его анализ Загрузка должна быть в "тесной петле". Мне нужен только источник в виде строки. Я попробовал это с помощью следующего кода, который не дал мне результатов. Если я не использую его со StaTaskScheduler, программа, кажется, зависает во время цикла. Есть идеи?

Спасибо

StaTaskScheduler sta = new StaTaskScheduler(numberOfThreads: 1); 
private void Button1_Click(object sender, RoutedEventArgs e)
        { 
   for (int i = 0; i < 2; i++)
            {
                Task.Factory.StartNew(() =>
                {
                    WebBrowser wb3 = new WebBrowser();
                    wb3.Source = new Uri("MyURL");
                    n++;
                    wb3.LoadCompleted += new LoadCompletedEventHandler(wb_LoadCompleted);
                }, CancellationToken.None, TaskCreationOptions.None, sta);
            }
        }

void wb_LoadCompleted(object sender, NavigationEventArgs e)
    {

 WebBrowser w = sender as WebBrowser;
  HtmlDocument document = new HtmlDocument(w.Document);

blockingCollection.Add(document.Body.OuterHtml);

        Task.Factory.StartNew(
           () =>
           {
               while (!blockingCollection.IsCompleted)
               {
                   string dlcode;
                   Thread.Sleep(500);
                   if (blockingCollection.TryTake(out dlcode))
                   {
    // tb is a TextBox
                         Dispatcher.BeginInvoke(new Action(() => { tb.Text = dlcode; }));
                   }
               }
           }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); 

}

1 Ответ

2 голосов
/ 12 августа 2011

Я бы рекомендовал не использовать WebBrowser для этого, а просто использовать WebClient напрямую. Это проще всего сделать, запрограммировав обернуть загружаемые данные в задание:

Task<string> DownloadStringAsync(Uri address)
{
     TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
     WebClient client = new WebClient();

     // Note that you can add error checking here by looking at e.Error/etc, and setting the cancel/error in tcs appropriately...
     client.DownloadStringCompleted += (o,e) => tcs.SetResult(e.Result);
     client.DownloadStringAsync(address);

     return tcs.Task;
}

При этом вы должны иметь возможность просто использовать эти задачи напрямую и устанавливать их результаты в БК по завершении. Это было бы намного проще, чем пытаться вращать элемент управления WebBrowser, предназначенный для визуального использования.

...