Parallel.Invoke подождать, пока HttpClient повторно войдет в систему c # - PullRequest
0 голосов
/ 01 февраля 2019

Я загружаю некоторые pdf файлы с веб-сайтов с HttpClient.Я должен войти, чтобы увидеть pdf 's url' s.

Я загружаю все PDF правильно, без использования Parallel.Но этот путь очень медленный.Я использую Parallel.Invoke для ускорения этой операции, но иногда отсутствует authentication.Поэтому мне нужно повторно войти на сайт и продолжить скачивать PDF-файлы и читать их.

List<Action> actionList = new List<Action>();
foreach (var item in company.PayrollTables)
            {
                actionList.Add(new Action(() => SavePayroll(item, myHtppClient, company.ClientId, company.SubClientNo)));// Download pdf's
            }
var options = new ParallelOptions { MaxDegreeOfParallelism = 20 };
            Parallel.Invoke(options, actionList.ToArray());

  public void SavePayroll(PayrollTableModel model, BaseHttpClient webClient, int ClientId, string subClientNo)
        {
            try
            {
                var byteArray = webClient.GetByteArrayAsync(model.pdfDownloadUrl).Result;
                var isPdf = IsPdf(byteArray, model, subClientNo, ClientId);

                if (isPdf)
                {
                    using (PdfReader reader = new PdfReader(byteArray))
                    {
                        for (int i = 1; i <= reader.NumberOfPages; i++)
                        {
                            string thePage = "";
                            thePage = PdfTextExtractor.GetTextFromPage(reader, i);
                            var table = GetEmployeeTable(thePage); // read existing page find table.

                            foreach (var row in table)
                            {

                               // read table nodes..                            
                            }
                        }
                    }
                }

            }
            catch (Exception e)
            {
                // 
            }


        }

myHtppClient является общим для всех параллельных действий. Это должно быть,Поскольку веб-сайт не допускает многократный вход в систему.

В методе SavePayroll я перемещаюсь между страницами веб-сайтов и нахожу правильные URL-адреса для загрузки pdf и чтения их с помощью ITextSharp.

Я использую DownloadString Метод изменения страниц для всех моих запросов и ловлю, если выход из системы или соединение все еще живы.Если веб-сайт отправил меня на страницу входа, чтобы я снова зарегистрировался.


public DownloadStringResult DownloadString(string url)
{
    DownloadStringResult result = new DownloadStringResult();
    try
    {
        var html = base.GetStringAsync(url).Result; // base is HttpClient.
        if (html.Contains(WebSiteDto.LogoutMessage) || html.Contains("Please Login")) // Log-out website. So I need to re-login again.
        {
            result.IsRelogged = true;
            result.HtmlResult = GetLoginResult(); // re-login
            return result;
        }
        result.HtmlResult = html;
    }
    catch (Exception e) // This try catch for TimeOut Exception. I try many way but I still cant catch timeout exception. Or I cant tell wait just 5 second, if no answer then retry again.
    {
        return DownloadString(url);
    }

    return result;
}

Можно ли как-то рассказать обо всех параллельных действиях ", подождите, пока одно действие повторно войдет в систему еще раз.продолжай делать свой процесс. "?

Заранее спасибо.

...