Формы Windows начинают зависать и зависать, как я могу сделать этот код эффективным?

1

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

private bool Ping(string url, Label label)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Timeout = 300;
            request.AllowAutoRedirect = false;
            request.Method = "HEAD";

            using (var response = request.GetResponse())
            {
                label.Text = "Online";
                label.ForeColor = Color.LimeGreen;
                return true;
            }
        }
        catch
        {
            label.Text = "Offline";
            label.ForeColor = Color.DarkRed;
            return false;
        }
    }

Я предполагаю, что причина, по которой приложение продолжает висит, - это из-за таймаута, когда там, по меньшей мере, на 15 сайтах Pinged потребуется некоторое время, есть ли способ, которым я могу изменить это, чтобы он не влиял на производительность приложений. Я бы хотел, чтобы Ping сайтов в таймер, так что каждые 10-30 секунд приложение снова засылает сайты.

Любые идеи относительно того, что мне нужно изменить, чтобы достичь этого?

  • 7
    Вы должны делать это асинхронно, а не синхронно.
Теги:
optimization
performance

1 ответ

1
Лучший ответ

Вы наблюдаете, как приложение висит, потому что вы блокируете поток пользовательского интерфейса. Лучший способ избежать этого - использовать асинхронную модель программирования. Если вы используете С# 5 и.net 4.5, проще всего использовать ключевые слова async/await.

Вы должны изменить подпись метода на:

private async Task<bool> Ping(string url, Label label)

и изменить код на:

using (var response = await request.GetResponseAsync())
  • 0
    Извините, если кажется, что я спрашиваю немного, не могли бы вы привести пример?
  • 0
    Что еще тебе нужно?
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню