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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструктр статического объекта 
:(
    Опции темы
Lazin
Дата 1.3.2010, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Добрый день.

Столкнулся со следующей проблемой. У меня есть некий класс Foo, у которого есть частная переменная
Код

private AutoResetEvent complete = new AutoResetEvent(true);

в деструкторе объекта, происходит ожидание этого события
Код

~Foo()
{
    if (!complete.WaitOne(timeout))
        ....
}

объект класса Foo, является статическим членом другого класса
Код

    public class Bar
    {
        private static Foo foo;

проблема собственно в том, что в деструкторе не происходит ожидание, хотя управление туда попадает
я пока не разобрался в том, что там происходит, но если убрать все вызовы complete.Set() и все вызовы complete.Reset(), по идее, приложение должно зависнуть при завершении, на вызове WaitOne, но этого не происходит...
В чем может быть дело?

Это сообщение отредактировал(а) Lazin - 1.3.2010, 10:01
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 1.3.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Lazin @  1.3.2010,  10:00 Найти цитируемый пост)
я пока не разобрался в том, что там происходит, но если убрать все вызовы complete.Set() и все вызовы complete.Reset(), по идее, приложение должно зависнуть при завершении, на вызове WaitOne, но этого не происходит...

нет, 1 раз Reset нужно вызвать, тогда будет зависать, ты же в конструктор true передал
Код

var complete = new AutoResetEvent(false);
MessageBox.Show("start");
complete.WaitOne(1000); // будет ждать!
MessageBox.Show("end");


Код

var complete = new AutoResetEvent(true);
MessageBox.Show("start");
complete.WaitOne(1000); // НЕ будет ждать
MessageBox.Show("end");


Код

var complete = new AutoResetEvent(true);
MessageBox.Show("start");
complete.Reset();
complete.WaitOne(1000); // будет ждать!
MessageBox.Show("end");


п.с. а ты уверен что в твоем случае можно полагаться на деструктор?

Это сообщение отредактировал(а) azesmcar - 1.3.2010, 10:27
PM   Вверх
mrbrooks
Дата 1.3.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(azesmcar @  1.3.2010,  10:22 Найти цитируемый пост)
п.с. а ты уверен что в твоем случае можно полагаться на деструктор?

Dispose()?
PM MAIL   Вверх
Lazin
Дата 1.3.2010, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



пардон, у меня там false в конструкторе, должно зависать!
у меня код, после WaitOne вообще не выполняется, то есть управление попадает в WaitOne, после чего приложение завершается
Цитата(azesmcar @  1.3.2010,  10:22 Найти цитируемый пост)
п.с. а ты уверен что в твоем случае можно полагаться на деструктор?

вот я и хочу узнать, могу я на него полагаться или нет smile 
дело в том, что моя библиотека, выполняет в фоне разные операции, и перед закрытием приложения, оно должно дождаться, пока моя библиотека завершит все операции ввода/вывода
видимо придется делать это явно...
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 1.3.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Lazin @  1.3.2010,  10:36 Найти цитируемый пост)
вот я и хочу узнать, могу я на него полагаться или нет smile 

Читал как-то одну книгу, автор много страниц рассказывал о том, как написать программу, чтобы деструктор вызывался по желанию программиста, в конце нашел способ и сам же его опроверг на следующей странице smile 


Цитата(Lazin @  1.3.2010,  10:36 Найти цитируемый пост)
у меня код, после WaitOne вообще не выполняется, то есть управление попадает в WaitOne, после чего приложение завершается

завершается? а может exception? по дебагером смотрел?

PM   Вверх
Lazin
Дата 1.3.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



завернул вызов WaitOne в блок try catch - результат абсолютно такой-же... заходим в WaitOne, проходит несколько секунд и приложение завершается

Добавлено через 16 секунд
Цитата(azesmcar @  1.3.2010,  10:40 Найти цитируемый пост)
по дебагером смотрел?

только под ним и запускал )
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 1.3.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Lazin @  1.3.2010,  10:44 Найти цитируемый пост)
завернул вызов WaitOne в блок try catch - результат абсолютно такой-же... заходим в WaitOne, проходит несколько секунд и приложение завершается

Да, ты прав..скорее всего .NET убивает, проверил вот такой код
Код

namespace ConsoleApplication1
{
    class A
    {
        private AutoResetEvent _complete = new AutoResetEvent(false);

        public A()
        {
        }

        ~A()
        {
            _complete.WaitOne(10000);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            A t = new A();
        }
    }
}


он ждет, но не ждет 10 секунд, предполагаю, что .NET при очистке мусора видет что деструктор что-то подвис и завершает программу (или делает что-то еще, но что-то определенно делает).

Добавлено через 6 минут и 4 секунды
Поискал, в MSDN-е ничего об этом не нашел, но скорее всего задерживать работу сборщика мусора не следует smile

Добавлено через 10 минут и 41 секунду
Цитата(Стандарт)

The garbage collector is allowed wide latitude in deciding when to collect objects and run destructors. Specifically, the timing of destructor invocations is not deterministic, and destructors may be executed on any thread. For these and other reasons, classes should implement destructors only when no other solutions are feasible.

PM   Вверх
Lazin
Дата 1.3.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



нда, видимо нужно будет реализовать метод Close, и не париться
но как-то это совсем не кошерно smile 
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 1.3.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Lazin @  1.3.2010,  11:07 Найти цитируемый пост)
нда, видимо нужно будет реализовать метод Close, и не париться

А почему не реализовать IDisposable?
PM   Вверх
mrbrooks
Дата 1.3.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(azesmcar @  1.3.2010,  11:09 Найти цитируемый пост)
А почему не реализовать IDisposable?

третьей мессагой меня это тоже заинтересовало   smile 
чет вы тут мутите пацаны злое  smile 
PM MAIL   Вверх
Lazin
Дата 1.3.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



а разве метод Dispose не вызывается сборщиком мусора?

Добавлено через 32 секунды
то есть, результат будет таким же, если не вызвать его явно, или не использовать using
PM MAIL Skype GTalk   Вверх
mrbrooks
Дата 1.3.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



да
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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