Управление потоком в приложении Windows - PullRequest
0 голосов
/ 19 января 2012

Мое приложение имеет одноэлементный класс CycleManager.Для этой цели я создал запечатанный класс, например,

public sealed class CycleManager
{
    public static readonly CycleManager instance = new CycleManager();

    public CycleManager()
    {
        //ReadFromIsolatedStorage();
    }

    public static CycleManager Instance
    {
        get
        {
            return instance;
        }

    }
}

. И файл App.xaml.cs имеет следующий код

    public App()
    {
        UnhandledException += Application_UnhandledException;

        InitializeComponent();

        InitializePhoneApplication();

        RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);            if (System.Diagnostics.Debugger.IsAttached)
        {
            Application.Current.Host.Settings.EnableFrameRateCounter = true;

            PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
        }
    }

. Я использовал RootFrame_Navigating () для проверкимне нужно перейти на главную страницу или страницу входа в систему.

    void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        //throw new NotImplementedException();
        if (e.Uri.ToString().Contains("/RootPage.xaml") != true)
            return;

        CycleManager pCycMan = CycleManager.instance;

        e.Cancel = true;
        RootFrame.Dispatcher.BeginInvoke(delegate
        {
            if (pCycMan.GetPasswordEnabled())
                RootFrame.Navigate(new Uri("/PasswordPage.xaml", UriKind.Relative));
            else
                RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        });
    }

Я ожидал, что экземпляр Cyclemanager будет создан при вызове экземпляра внутри RootFrame_Navigating ()

Но отладкапоказал мне, что после конструктора App () поток управления перемещается в класс диспетчера циклов, а после конструктора CycleManager () перемещается в RootFrame_Navigating.!!Что-то не так или я понял это неправильно?

Во-вторых, при выполнении CycleManager pCycMan = CycleManager.instance; я ожидал, что вызывается следующий код в CycleManager, но на удивление это не так.Тогда как управляется свойство синглтона?или каждый раз, когда создается новый объект?

    public static CycleManager Instance
    {
        get
        {
            return instance;
        }

    }

Алфа

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вы на самом деле не обращаетесь к свойству get в вашем методе RootFrame_Navigating. Вы непосредственно нажимаете на статическое поле (оно объявлено публичным)

public sealed class CycleManager
{
   public static readonly CycleManager instance = new CycleManager();

...

CycleManager pCycMan = CycleManager.instance;

Я думаю, что вы хотели напечатать CycleManager.Instance (с большой буквы "i")

0 голосов
/ 19 января 2012

Если вы посмотрите на спецификацию C # для статической инициализации поля

[...] инициализаторы статического поля выполняются в зависящее от реализации время до первого использования статического поля этого класса

Таким образом, порядок попадания в точки останова соответствует спецификации, другими словами, статические поля инициализируются через некоторое время, определяемое средой выполнения. Однако точные сроки не указаны. Вы не должны писать код, который зависит от порядка инициализации статических полей.

Ваша вторая проблема - доступ к полю, а не к свойству instance против Instance. Вы должны сделать ваше статическое поле приватным.

...