Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с GetResponse 
:(
    Опции темы
alexplato
Дата 10.2.2011, 11:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 14.11.2010

Репутация: нет
Всего: нет



Написал функцию для сохранения картинок на локальный компьютер. Теперь при использовании часто сталкиваюсь со следующей проблемой. Функция просто зависает здесь myReq.GetResponse();
Ниже вы видите что я попытался установить таймаут - он конечно помогает оборвать зависание, но проблема в следующем:

1. файл так и не грузится (даже если увеличиваю таймаут, кстати тестирую на маленьких файла до 20Кб, которые в браузере вообще быстро подгружаются);

2. насколько я понимаю если грузить большие файлы, то даже при нормальной загрузке timeout будет принудительно обрывать их.

В общем как правильно выйти из данной ситуации? В чем может быть проблема (отмечу, что она проявляется как то незакономерно - на одних и тех же файлах иногда есть, иногда нет)? Как проверить на ходу завис ли GetResponse или просто сейчас еще загружает большой файл?

Может подскажете какой нибудь другой более правильный вариант реализации?

Код

public static bool loadImageLocally(string fullPath, string saveto,int timeout = 1000)
        {
            byte[] bytes;
            try
            {
                HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(fullPath);
                myReq.Timeout = timeout;
                
                
                WebResponse myResp = myReq.GetResponse();

                Stream stream = myResp.GetResponseStream();
                //int i;
                using (BinaryReader br = new BinaryReader(stream))
                {
                    //i = (int)(stream.Length);
                    bytes = br.ReadBytes(500000);
                    br.Close();
                }
                myResp.Close();
                FileStream fs = new FileStream(saveto, FileMode.Create);
                BinaryWriter w = new BinaryWriter(fs);

                w.Write(bytes);

                fs.Close();
                w.Close();
            }
            catch
            {
                return false;
            }
            return true;

        }

PM MAIL   Вверх
jonie
Дата 10.2.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



потому что не освобождаете ресурсы. Всё что наследует IDisposable надо высвобождать (желательно самому) - иначе получится как у вас либо Exception.
Т.е. using-ов у вас как минимум не хватает.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
KelTron
Дата 10.2.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Ну можно вообще не напрягаясь:
Код

var wc = new WebClient();
wc.DownloadFile("file_url", "save_path");

Или ручками:
Код

class Program
{
    static void Main(string[] args)
    {
        DownloadFile("file_url", "save_path");
    }

    private static void DownloadFile(string url, string filePath) 
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        var response = (HttpWebResponse)request.GetResponse();

        using (var stream = response.GetResponseStream())
        using (var fStream = new FileStream(filePath, FileMode.Create))
        {
            byte[] buffer = new byte[32768];
            while (true)
            {
                int read = stream.Read(buffer, 0, buffer.Length);
                if (read <= 0)
                {
                    return;
                }

                fStream.Write(buffer, 0, read);
            } 
        }
    }
}



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
jonie
Дата 10.2.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



KelTron, а Close() вызывать типа не надо у webResponce-ов ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
KelTron
Дата 10.2.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата

Необходимо вызвать метод Stream.Close или HttpWebResponse.Close, чтобы закрыть поток и освободить подключение для повторного использования. Не обязательно вызывать оба метода Stream.Close и HttpWebResponse.Close, но вызов двух этих методов не станет причиной ошибки.

http://msdn.microsoft.com/ru-ru/library/sy...ponse.aspx#Y800


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1177 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.