Действительно ли возможно отследить выделение/освобождение?

Я хотел бы поделиться шаблоном, который я использовал для решения этих проблем. Я думаю, это работает неплохо. Конечно, он работает только в том случае, если у вас есть контроль над тем, что вызывает конструктор. Пример ниже

public class MyClass
{
    public static async Task<MyClass> Create()
    {
        var myClass = new MyClass();
        await myClass.Initialize();
        return myClass;
    }

    private MyClass()
    {

    }

    private async Task Initialize()
    {
        await Task.Delay(1000); // Do whatever asynchronous work you need to do
    }
}

В основном мы делаем конструктор частным и создаем собственный публичный статический асинхронный метод, который отвечает за создание экземпляра MyClass. Сделав конструктор частным и сохраняя статический метод в одном классе, мы убедились, что никто не может «случайно» создать экземпляр этого класса, не вызывая правильные методы инициализации. Вся логика вокруг создания объекта все еще содержится внутри класса (только внутри статического метода).

var myClass1 = new MyClass() // Cannot be done, the constructor is private
var myClass2 = MyClass.Create() // Returns a Task that promises an instance of MyClass once it's finished
var myClass3 = await MyClass.Create() // asynchronously creates and initializes an instance of MyClass

Реализована в текущем сценарии, она будет выглядеть примерно так:

public partial class Page2 : PhoneApplicationPage
{
    public static async Task<Page2> Create()
    {
        var page = new Page2();
        await page.getWritings();
        return page;
    }

    List<Writing> writings;

    private Page2()
    {
        InitializeComponent();
    }

    private async Task getWritings()
    {
        string jsonData = await JsonDataManager.GetJsonAsync("1");
        JObject obj = JObject.Parse(jsonData);
        JArray array = (JArray)obj["posts"];

        for (int i = 0; i < array.Count; i++)
        {
            Writing writing = new Writing();
            writing.content = JsonDataManager.JsonParse(array, i, "content");
            writing.date = JsonDataManager.JsonParse(array, i, "date");
            writing.image = JsonDataManager.JsonParse(array, i, "url");
            writing.summary = JsonDataManager.JsonParse(array, i, "excerpt");
            writing.title = JsonDataManager.JsonParse(array, i, "title");

            writings.Add(writing);
        }

        myLongList.ItemsSource = writings;
    }
}

И вместо выполнения

var page = new Page2();

Вы будете делать

var page = await Page2.Create();
5
задан csharpwinphonexaml 4 May 2014 в 22:00
поделиться

2 ответа

CLR имеет 'профильный API', который сцепляется в в значительной степени все - это - то, чему коммерческой памяти.NET профильное использование продуктов, я верю. Вот ссылка MSDN на верхний уровень документации: Общая информация Платформы.NET: О Профильном API

См. эту статью MSDN Magazine для введения в часть памяти: Осмотрите и Оптимизируйте Использование памяти Своей Программы с Профилировщиком.NET API

8
ответ дан 14 December 2019 в 01:22
поделиться

Я просто использовал бы Профилировщика МУРАВЬЕВ Красного Логического элемента. Это скажет Вам много о том, что продолжается в памяти без Вас имеющий необходимость изучить профильный API самих.

1
ответ дан 14 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: