GetResponse () занимает слишком много времени - PullRequest
0 голосов
/ 15 ноября 2011

Я работаю над приложением winforms.

У меня есть функция для проверки URL.

  private void checkForSPSiteValidity(DataGridView Sites_dataGridView)
    {
        foreach (DataGridViewRow myRow in SharePointSites_dataGridView.Rows)
        {
            try
            {
                DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell;

                string url = myRow.Cells[CommonCodeClass.spURL_GridCol].Value.ToString();

                WebRequest req = WebRequest.Create(url);

                WebResponse res = req.GetResponse();

                cell.Value = Image.FromFile(CommonCodeClass.Correct_Icons);

            }
            catch (WebException ex)
            {
                Console.WriteLine(ex.Message);
                if (ex.Message.Contains("remote name could not be resolved"))
                {
                    DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell;

                    cell.Value = Image.FromFile(CommonCodeClass.warning_Icon);
                }
            }
        }
    }

Этот код работает нормально, и я получаю правильные значения, но для его обработки требуется много времени, и в большинстве случаев приложение зависает.

Я новичок в потоках, так что есть ли способ реализовать это с этим. Пример будет действительно полезен

Если есть какой-то другой лучший способ сделать это, пожалуйста, дайте мне знать.

Спасибо

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Проверьте BackgroundWorker элемент управления.Это один простой способ сделать это.

HTH.

1 голос
/ 15 ноября 2011

Отличный способ сделать это - использовать пул потоков:

Это просто реализовать ибыло бы хорошо при сокращении большого количества запросов.

Вы также можете указать максимальное количество потоков и циклов для наборов 15, 25, 50 и т. д., чтобы не сокращать слишком много потоков и завершатьразрезание большего количества нитей, то есть выгода.Я бы поэкспериментировал с этим, чтобы выяснить, когда вы начнете терять оптимизацию.

Приятно то, что (смотрите первую ссылку) вы передаете объект (Object threadContext), где это не обязательно должен быть одинзначение ... это может быть массив, список и т. д., которые преобразуются в объект.При работе со списками и т. Д. Вам, возможно, придется немного взглянуть на безопасность потоков =, но я чувствую, что на данный момент это, вероятно, больше, чем вы делаете с потоками.

.

.

Оцените, если полезно.

1 голос
/ 15 ноября 2011

Поскольку вы указываете на решение самостоятельно, вы должны выполнять выборку асинхронно. BackgroundWorker - хороший класс для запуска, особенно потому, что он является нативным компонентом WinForms.

Вы также можете посмотреть новые новые расширения async в C #, если хотитерешите это более общим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...