Удаление обьекта
От: Holms США  
Дата: 09.11.08 20:04
Оценка:
День добрый

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

using System;
using System.Collections.Generic;

namespace TestWeakReference
{
  class Program
  {
    static void Main()
    {
      List<MyClass> list = new List<MyClass>
                             {
                               new MyClass { msg = "unu" },
                               new MyClass { msg = "doi" },
                               new MyClass { msg = "trei" },
                               new MyClass { msg = "patru" },
                             };

      List<WeakReference> weaks = new List<WeakReference>();
      foreach (MyClass myClass in list)
      {
        weaks.Add(new WeakReference(myClass));
      }


      Console.WriteLine("All must be alive");
      foreach (WeakReference weak in weaks)
      {
        Console.WriteLine(string.Format("Alive {0}, class = {1}", weak.IsAlive, ((MyClass)weak.Target).msg));
      }

      //find needed one
      MyClass my = list.Find(class1 => class1.msg == "doi");

      //do something with it and delete from list
      list.Remove(my);
      my = null; //Как здесь убить обьект что-бы WeakReference.IsAlive в другом списке была False
      //check weaks

      Console.WriteLine("\tOne must be dead");
      foreach (WeakReference weak in weaks)
      {
        Console.WriteLine(string.Format("Alive {0}, class = {1}", weak.IsAlive, ((MyClass)weak.Target).msg));
      }


      Console.ReadKey();
    }
  }

  class MyClass
  {
    public string msg { get; set; }
  }
}


Собственно, как убить обьект и ссылки на него?

Спасибо
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
The life is relative and reversible.
Re: Удаление обьекта
От: PavPS  
Дата: 09.11.08 20:25
Оценка:
Удалив сам оьъект из листа — вы убрали едиственную на него сслыку (кроме weak) и ктому же предполагаем что лист при методе remove во внутреннем массиве выставил соответстующему элементу null (читай cli исходники листа или мсдн . Так вот, чтобы .Alive == false нучно чтобы сборщик мыслора сработал и собрал мусор. Вызываем GC.Collect и сботщик увидев, что на этот объект нет ни одной ссылки — убивает его (weak он "не считает").
Re[2]: Удаление обьекта
От: adontz Грузия http://adontz.wordpress.com/
Дата: 09.11.08 20:42
Оценка:
Здравствуйте, PavPS, Вы писали:


public void RemoveAt(int index)
{
    T local;
    if (index < this._size)
    {
        goto Label_000E;
    }
    ThrowHelper.ThrowArgumentOutOfRangeException();
Label_000E:
    this._size -= 1;
    if (index >= this._size)
    {
        goto Label_0042;
    }
    Array.Copy(this._items, index + 1, this._items, index, this._size - index);
Label_0042:
    this._items[this._size] = default(T);
    this._version += 1;
    return;
}


Надежды оправдались. Осталось вызвать GC.Collect();
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Удаление обьекта
От: MozgC США http://nightcoder.livejournal.com
Дата: 09.11.08 21:31
Оценка: 39 (1)
Ром, включи оптимизацию до .NET 3.5 в рефлекторе
Re[2]: Удаление обьекта
От: Holms США  
Дата: 09.11.08 23:23
Оценка:
Здравствуйте, PavPS, Вы писали:

PPS>Удалив сам оьъект из листа — вы убрали едиственную на него сслыку (кроме weak) и ктому же предполагаем что лист при методе remove во внутреннем массиве выставил соответстующему элементу null (читай cli исходники листа или мсдн . Так вот, чтобы .Alive == false нучно чтобы сборщик мыслора сработал и собрал мусор. Вызываем GC.Collect и сботщик увидев, что на этот объект нет ни одной ссылки — убивает его (weak он "не считает").


Сделал так
Console.WriteLine("All must be alive");
      foreach (WeakReference weak in weaks)
      {
        Console.WriteLine(string.Format("Alive {0}, class = {1}", weak.IsAlive, ((MyClass)weak.Target).msg));
      }

      //find needed one
      MyClass my = list.Find(class1 => class1.msg == "doi");

      //do something with it and delete from list
      list.Remove(my);
      my = null;
      GC.Collect();
      //check weaks

      Console.WriteLine("\tOne must be dead");
      foreach (WeakReference weak in weaks)
      {
        Console.WriteLine(string.Format("Alive {0}, class = {1}", weak.IsAlive, ((MyClass)weak.Target).msg));
      }

всё-равно получаю для всех четырех week.IsAlive = true;

Идеи?

Спасибо
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
The life is relative and reversible.
Re[3]: Удаление обьекта
От: desco США http://v2matveev.blogspot.com
Дата: 09.11.08 23:31
Оценка:
Здравствуйте, Holms, Вы писали:

H>Здравствуйте, PavPS, Вы писали:


PPS>>Удалив сам оьъект из листа — вы убрали едиственную на него сслыку (кроме weak) и ктому же предполагаем что лист при методе remove во внутреннем массиве выставил соответстующему элементу null (читай cli исходники листа или мсдн . Так вот, чтобы .Alive == false нучно чтобы сборщик мыслора сработал и собрал мусор. Вызываем GC.Collect и сботщик увидев, что на этот объект нет ни одной ссылки — убивает его (weak он "не считает").


H>Сделал так

H>
H>Console.WriteLine("All must be alive");
H>      foreach (WeakReference weak in weaks)
H>      {
H>        Console.WriteLine(string.Format("Alive {0}, class = {1}", weak.IsAlive, ((MyClass)weak.Target).msg));
H>      }

H>      //find needed one
H>      MyClass my = list.Find(class1 => class1.msg == "doi");

H>      //do something with it and delete from list
H>      list.Remove(my);
H>      my = null;
H>      GC.Collect();
H>      //check weaks

H>      Console.WriteLine("\tOne must be dead");
H>      foreach (WeakReference weak in weaks)
H>      {
H>        Console.WriteLine(string.Format("Alive {0}, class = {1}", weak.IsAlive, ((MyClass)weak.Target).msg));
H>      }
      
      
      
H>

H>всё-равно получаю для всех четырех week.IsAlive = true;

H>Идеи?


H>Спасибо


давайте угадаю: собираете и запускаете Debug конфигурацию?
переключитесь в Release и наступит счастье. В Debug время жизни обьектов продлевается

PS. для мертвой ссылки ((MyClass)weak.Target).msg) упадет с NullReferenceException.
Re[4]: Удаление обьекта
От: Holms США  
Дата: 09.11.08 23:36
Оценка:
Здравствуйте, desco, Вы писали:

D>давайте угадаю: собираете и запускаете Debug конфигурацию?

так точно
D>переключитесь в Release и наступит счастье. В Debug время жизни обьектов продлевается
и как тогда дебугить?

D>PS. для мертвой ссылки ((MyClass)weak.Target).msg) упадет с NullReferenceException.

этого и хочется, но не получается
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
The life is relative and reversible.
Re[4]: Удаление обьекта
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.11.08 03:31
Оценка: :)
Здравствуйте, MozgC, Вы писали:

MC>Ром, включи оптимизацию до .NET 3.5 в рефлекторе


А я только привык к говёной декомпиляции
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Удаление обьекта
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.11.08 06:29
Оценка:
Здравствуйте, Holms, Вы писали:
H>Возможно это будет вопрос для первого класса не все-таки спрошу
H>Собственно, как убить обьект и ссылки на него?
Вопрос для второго класса: а зачем? Какой именно побочный эффект хочется получить от смерти недоступного объекта?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Удаление обьекта
От: Holms США  
Дата: 10.11.08 06:36
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Вопрос для второго класса: а зачем? Какой именно побочный эффект хочется получить от смерти недоступного объекта?


данный обьект используется еще в N других List, Dictionary<somethin, List<objects>>,... которые делают с обьектом что-то если только он есть и не удален.
Понимаю что можно при удалении из главного списка можно удалить и в остальных, но хочется другого решения
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
The life is relative and reversible.
Re[5]: Удаление обьекта
От: _FRED_ Черногория
Дата: 10.11.08 07:18
Оценка: 39 (1)
Здравствуйте, adontz, Вы писали:

MC>>Ром, включи оптимизацию до .NET 3.5 в рефлекторе


A>А я только привык к говёной декомпиляции


А ещё лучше закачай и настрой работу с исходниками
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Удаление обьекта
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.11.08 13:42
Оценка:
Здравствуйте, Holms, Вы писали:
H>данный обьект используется еще в N других List, Dictionary<somethin, List<objects>>,... которые делают с обьектом что-то если только он есть и не удален.
На всякий случай напомню, что если объект используется еще в N других местах, то он никогда не будет удалён.
Добро пожаловать в мир со сборкой мусора.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Удаление обьекта
От: Holms США  
Дата: 10.11.08 16:47
Оценка:
Здравствуйте, Sinclair, Вы писали:


S>На всякий случай напомню, что если объект используется еще в N других местах, то он никогда не будет удалён.

S>Добро пожаловать в мир со сборкой мусора.
так поэтому и использую WeakReference? думал что это поможет
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
The life is relative and reversible.
Re[6]: Удаление обьекта
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.11.08 20:54
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А ещё лучше закачай и настрой работу с исходниками


Что-то у меня всё тормознулось от этих исходников. Хотя комментарии познавательные.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[7]: Удаление обьекта
От: _FRED_ Черногория
Дата: 10.11.08 21:01
Оценка:
Здравствуйте, adontz, Вы писали:

_FR>>А ещё лучше закачай и настрой работу с исходниками

A>Что-то у меня всё тормознулось от этих исходников. Хотя комментарии познавательные.

Тормозится (по серьёзному) в первый раз только — загружаются символы. Можно ещё в отладчике открыть окно Modules и врукопашную загрузить всё что возможно. В будущем, "в боевых условиях", потом поскорее будет. А, вообще, немного да, на слабых машинах заметненько, но особых неудобств не доставляет.
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Удаление обьекта
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.11.08 21:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Тормозится (по серьёзному) в первый раз только — загружаются символы. Можно ещё в отладчике открыть окно Modules и врукопашную загрузить всё что возможно. В будущем, "в боевых условиях", потом поскорее будет. А, вообще, немного да, на слабых машинах заметненько, но особых неудобств не доставляет.


Ну если Х2 4600+/2Гб уже считается слабой машинкой...
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[9]: Удаление обьекта
От: _FRED_ Черногория
Дата: 11.11.08 08:29
Оценка:
Здравствуйте, adontz, Вы писали:

_FR>>Тормозится (по серьёзному) в первый раз только — загружаются символы. Можно ещё в отладчике открыть окно Modules и врукопашную загрузить всё что возможно. В будущем, "в боевых условиях", потом поскорее будет. А, вообще, немного да, на слабых машинах заметненько, но особых неудобств не доставляет.


A>Ну если Х2 4600+/2Гб уже считается слабой машинкой...


Я заметил тормоза в отладке после установки первого сервиспака к 2008. после подключения символов разница оказалась не очень большая :о)) и это на P4 3.0GHz/1GB да и, когда торопишься, можно быстро отключить :о))
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Удаление обьекта
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.11.08 08:41
Оценка:
Здравствуйте, Holms, Вы писали:
H>так поэтому и использую WeakReference? думал что это поможет
Ну так ты же не используешь WeakReference во всех местах.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Удаление обьекта
От: _FRED_ Черногория
Дата: 11.11.08 11:09
Оценка:
Здравствуйте, adontz, Вы писали:

_FR>>А ещё лучше закачай и настрой работу с исходниками


A>Что-то у меня всё тормознулось от этих исходников. Хотя комментарии познавательные.


Понял: тормознулось не из-за исходников, а из-за загрузки символов в отладчик. Тут уж (сам) ничего не поделаешь
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Удаление обьекта
От: desco США http://v2matveev.blogspot.com
Дата: 11.11.08 11:23
Оценка: 27 (1)
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, adontz, Вы писали:


_FR>>>А ещё лучше закачай и настрой работу с исходниками


A>>Что-то у меня всё тормознулось от этих исходников. Хотя комментарии познавательные.


_FR>Понял: тормознулось не из-за исходников, а из-за загрузки символов в отладчик. Тут уж (сам) ничего не поделаешь


.NET Mass Downloader

Improvements in Version 1.5
.NET Mass Downloader now supports downloading the source code for .NET 3.5 SP1 and filling the symbol and source server cache for VS 2008 SP1. It also includes numerous bug fixes and feature tweaks that we are sure you will enjoy.

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.