Здравствуйте, rsn81, Вы писали:
R>Здравствуйте, <Аноним>, Вы писали:
А>>при необходимости можно вызвать принудительную сборку мусора, вплоть до очистки всех неиспользуемых объектов
R>Не стоит, это очень нехорошо.
R>Для этого нужно использовать слабые ссылки WeakReference.
Чистку мусора я конечно же вызываю и конечно же это ничего не меняет. и WeakReference
я использую ... иначе как понять что объект еще не удален.
Я тут заметил что сборщик мусора ведет себя по разному
в зависимости от того как я запускаю приложение.
т.е. Из студии в режими отладки одно поведение, просто с диска скомпилированный
проект другое ... а скомпилированный в режиме релиза третье.
Кто-нибудь может пояснить чем отличаются различные режимы запуска для сборщика мусора?
И еще есть у меня вот такой пример: (Извеняюсь что много кода)
using System;
using System.Collections.Generic;
using System.Text;
namespace User
{
public class Test
{
}
public class Stat
{
public static Test CreateTest(Test Parent, Type ObjectType)
{
return Activator.CreateInstance(ObjectType) as Test;
}
}
class Program
{
static void Main(string[] args)
{
List<Type> lT = new List<Type>();
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
lT.Add(typeof(Object));
// Все работает правильно
//Test tt = new Test();
// Работает не правильно
Test tt = Activator.CreateInstance(typeof(Test)) as Test;
WeakReference wr = new WeakReference(tt);
tt = null;
long pGC1 = GC.GetTotalMemory(false);
GC.Collect();
GC.WaitForPendingFinalizers();
int iiII = -1;
if (wr.Target != null)
{
Console.WriteLine("Error");
iiII = GC.GetGeneration(wr);
}
else
{
Console.WriteLine("OK");
}
Test n1 = Stat.CreateTest(null, typeof(Test));
Test n2 = Stat.CreateTest(null, typeof(Test));
Console.ReadLine();
}
}
}
Так вот если я объект создаю через активатор, то работает не правильно, если напрямую через new то правильно.
Такая ситуация наблюдается только при запуске из студии
У меня есть более сложный пример в котором подобная же ситуация наблюдается всегда кроме запуска из релизной сборки.
В общем я не знаю как понимать то, что происходит.
Если кто может прояснить ситуацию, объясните пожалуйста в чем дело.
Спасибо!