Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

BackgroundWorker не завершает работу...

22K
19 декабря 2007 года
MaaXSeeR
6 / / 13.03.2007
Собственно сабж.

Код:
bw_response = [COLOR=DarkRed]""[/COLOR];
            [COLOR=SeaGreen]BackgroundWorker [/COLOR]bw = [COLOR=Blue]new[/COLOR] [COLOR=SeaGreen]BackgroundWorker[/COLOR]();
            bw.DoWork += [COLOR=Blue]delegate[/COLOR]([COLOR=Blue]object [/COLOR]sender, [COLOR=SeaGreen]DoWorkEventArgs[/COLOR] e)
                {
                    [COLOR=SeaGreen]ServicePointManager[/COLOR].CertificatePolicy = [COLOR=Blue]new[/COLOR] [COLOR=SeaGreen]MyCertPolicy[/COLOR]();

                    [COLOR=SeaGreen]HttpWebRequest [/COLOR]WebRequest = ([COLOR=SeaGreen]HttpWebRequest[/COLOR])[COLOR=SeaGreen]HttpWebRequest[/COLOR].Create(e.Argument.ToString());
                    WebRequest.AllowAutoRedirect = [COLOR=Blue]true[/COLOR];
                    [COLOR=SeaGreen]HttpWebResponse[/COLOR] WebResponse = ([COLOR=SeaGreen]HttpWebResponse[/COLOR])WebRequest.GetResponse();
                    [COLOR=SeaGreen]StreamReader[/COLOR] StreamReader = [COLOR=Blue]new[/COLOR] [COLOR=SeaGreen]StreamReader[/COLOR](WebResponse.GetResponseStream(), [COLOR=SeaGreen]Encoding[/COLOR].GetEncoding(1251));
                    e.Result = (StreamReader.ReadToEnd());
                    WebRequest = [COLOR=Blue]null[/COLOR];
                    WebResponse = [COLOR=Blue]null[/COLOR];
                    StreamReader = [COLOR=Blue]null[/COLOR];
                };
            bw.RunWorkerCompleted += [COLOR=Blue]delegate[/COLOR]([COLOR=Blue]object[/COLOR] sender, [COLOR=SeaGreen]RunWorkerCompletedEventArgs[/COLOR] e)
                {
                    bw_response = e.Result.ToString();
                };
            bw.WorkerSupportsCancellation = [COLOR=Blue]true[/COLOR];
            bw.RunWorkerAsync(url);
            [COLOR=Blue]while[/COLOR] (bw.IsBusy) { };
            bw =[COLOR=Blue] null[/COLOR];

            [COLOR=Blue]return[/COLOR] bw_response;
Первый раз выполняется все на ура. Сначала DoWork, за ним RunWorkerCompleted. Когда запускается второй раз, воркер выполняет все что ему требуется и зависает между DoWork и RunWorkerCompleted (т.е завершается (как этовидно при отладке) DoWork...и все...... IsBusy постоянно true... В чем может быть проблема?
5
19 декабря 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: MaaXSeeR
Первый раз выполняется все на ура. Сначала DoWork, за ним RunWorkerCompleted.


Пользуйся using конструкциями. У тебя отложено освобождение ресурсов - этим занимается сборщик мусора черте когда. Присвоение переменной null никак не сказывается на освобождении ресурсов, а лишь захламляет код.
Для примера:

 
Код:
using(BackgroundWorker bw = new BackgroundWorker()) {
....
}
Аналогично со StreamReader-ом и HttpWebRequest-ом.
22K
20 декабря 2007 года
MaaXSeeR
6 / / 13.03.2007
Цитата: hardcase
Пользуйся using конструкциями. У тебя отложено освобождение ресурсов - этим занимается сборщик мусора черте когда. Присвоение переменной null никак не сказывается на освобождении ресурсов, а лишь захламляет код.
Для примера:
 
Код:
using(BackgroundWorker bw = new BackgroundWorker()) {
....
}
Аналогично со StreamReader-ом и HttpWebRequest-ом.



Спасибо, но это не помогло. Как вис, так и виснет...

370
20 декабря 2007 года
koval
443 / / 29.08.2005
Попробуй не использовать BackgroundWorker. Я не совсем помню, создает ли BackgroundWorker фоновые потоки. Если нет, то я думаю, что в этом и проблема. Попробуй воспользоваться ThreadPool.
5
21 декабря 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: MaaXSeeR
Спасибо, но это не помогло. Как вис, так и виснет...


Я еще раз говорю про освобождение ресурсов.
HttpWebResponse - это соединение. Его НУЖНО закрывать вызывая Close или (что лучше) использованием using конструкции:

 
Код:
using(WebResponse response = request.GetResponse()) {
    HttpWebResponse http_response = response as HttpWebResponse;
    if(http_response != null) {
        // далее твой код работы с http_response:
        using(StreamReader reader = new StreamReader(http_response.GetResponseStream(), Encoding.GetEncoding(1251)) {
            e.Result = reader.ReadToEnd();
        }
    }
}



З.Ы. именуй локальные переменные (хотябы) кэмелом: myLocalVar.
35K
27 декабря 2007 года
Boglen
2 / / 27.12.2007
hardcase с чего вы предположили что виной всему именно не освобожденные ресурсы?

Тем более судя по
return bw_response;


воркер выполняется один раз, после чего метод возвращает значение.
Может быть вы пытаетесь получить доступ к общим ресурсам в результате чего не успевший поток виснет?
Приложите полный листинг кода.

Кстати для сборки мусора можно использовать
GC.Collect(); и GC.WaitForPendingFinalizers();
5
27 декабря 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: Boglen
hardcase с чего вы предположили что виной всему именно не освобожденные ресурсы?


Количество одновременных http-запросов ограничено (по дефолту 2я или 4я - не помню). Отсюда следствие: их НУЖНО закрывать.

Цитата: Boglen

Приложите полный листинг кода.


Поддерживаю.

Цитата: Boglen

Кстати для сборки мусора можно использовать
GC.Collect(); и GC.WaitForPendingFinalizers();


Можно. Только в действительности их нужно вызывать, когда освобождается ОЧЕНЬ много объектов.
Здесь не тот случай.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог